TelecomSystemTest.java revision 2c93c50e5be7d85b78c4af15aaa10e44f0bcdf3e
1aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad/* 2aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * Copyright (C) 2015 The Android Open Source Project 3aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * 4aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * Licensed under the Apache License, Version 2.0 (the "License"); 5aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * you may not use this file except in compliance with the License. 6aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * You may obtain a copy of the License at 7aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * 8aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * http://www.apache.org/licenses/LICENSE-2.0 9aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * 10aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * Unless required by applicable law or agreed to in writing, software 11aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * distributed under the License is distributed on an "AS IS" BASIS, 12aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * See the License for the specific language governing permissions and 14aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * limitations under the License. 15aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad */ 16aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 172c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerpackage com.android.server.telecom.tests; 18aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 1932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad 2092694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Matchers.any; 2192694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Matchers.anyBoolean; 2292694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Matchers.anyInt; 2392694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Matchers.anyString; 2492694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Matchers.eq; 258fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport static org.mockito.Mockito.doAnswer; 268fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport static org.mockito.Mockito.doReturn; 2792694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Mockito.mock; 281b5490ac8643a5969adaba6f68d872acd251d666Ihab Awadimport static org.mockito.Mockito.reset; 2992694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Mockito.timeout; 3092694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Mockito.verify; 3192694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Mockito.when; 3292694519535c54f542b4ef3973e9c1934f2feeffSantos Cordon 3392694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.BroadcastReceiver; 3492694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.ComponentName; 3592694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.Context; 3692694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.Intent; 37b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awadimport android.media.AudioManager; 388fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport android.media.IAudioService; 3992694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.net.Uri; 4092694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.os.Bundle; 4192694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.os.Handler; 4292694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.os.UserHandle; 430a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awadimport android.telecom.Call; 44b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awadimport android.telecom.CallAudioState; 4532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awadimport android.telecom.Connection; 4692694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.ConnectionRequest; 4792694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.DisconnectCause; 4892694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.ParcelableCall; 4992694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.PhoneAccount; 5092694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.PhoneAccountHandle; 5192694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.TelecomManager; 5232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awadimport android.telecom.VideoProfile; 532c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport android.telephony.TelephonyManager; 5492694519535c54f542b4ef3973e9c1934f2feeffSantos Cordon 55aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport com.android.internal.telecom.IInCallAdapter; 562c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.CallAudioManager; 572c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.CallsManager; 582c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.HeadsetMediaButton; 592c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.HeadsetMediaButtonFactory; 602c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.InCallWakeLockController; 612c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.InCallWakeLockControllerFactory; 622c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.Log; 632c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.MissedCallNotifier; 642c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.ProximitySensorManager; 652c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.ProximitySensorManagerFactory; 662c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.TelecomSystem; 67aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 688fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport com.google.common.base.Predicate; 698fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 70aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport org.mockito.ArgumentCaptor; 71aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport org.mockito.Mock; 728fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport org.mockito.invocation.InvocationOnMock; 738fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport org.mockito.stubbing.Answer; 74aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 75abcbce4441720c52a443d292d5adc2d95f446494Ihab Awadimport java.util.concurrent.BrokenBarrierException; 76abcbce4441720c52a443d292d5adc2d95f446494Ihab Awadimport java.util.concurrent.CountDownLatch; 77abcbce4441720c52a443d292d5adc2d95f446494Ihab Awadimport java.util.concurrent.CyclicBarrier; 78abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 79aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadpublic class TelecomSystemTest extends TelecomTestCase { 80aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 8132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad static final int TEST_POLL_INTERVAL = 10; // milliseconds 82aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad static final int TEST_TIMEOUT = 1000; // milliseconds 83aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 84aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Mock MissedCallNotifier mMissedCallNotifier; 85aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Mock HeadsetMediaButton mHeadsetMediaButton; 86aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Mock ProximitySensorManager mProximitySensorManager; 87aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Mock InCallWakeLockController mInCallWakeLockController; 88aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 89aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mInCallServiceComponentNameX = 90aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 91aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-package-X", 92aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-class-X"); 93aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mInCallServiceComponentNameY = 94aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 95aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-package-Y", 96aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-class-Y"); 97aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 98aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad InCallServiceFixture mInCallServiceFixtureX; 99aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad InCallServiceFixture mInCallServiceFixtureY; 100aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 101aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mConnectionServiceComponentNameA = 102aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 103aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-package-A", 104aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-class-A"); 105aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mConnectionServiceComponentNameB = 106aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 107aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-package-B", 108aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-class-B"); 109aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 110aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final PhoneAccount mPhoneAccountA0 = 111aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.builder( 112aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new PhoneAccountHandle( 113aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceComponentNameA, 114aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "id A 0"), 115aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "Phone account service A ID 0") 116aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addSupportedUriScheme("tel") 117aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .setCapabilities( 118aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_CALL_PROVIDER | 119aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) 120aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .build(); 121aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final PhoneAccount mPhoneAccountA1 = 122aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.builder( 123aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new PhoneAccountHandle( 124aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceComponentNameA, 125aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "id A 1"), 126aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "Phone account service A ID 1") 127aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addSupportedUriScheme("tel") 128aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .setCapabilities( 129aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_CALL_PROVIDER | 130aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) 131aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .build(); 132aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final PhoneAccount mPhoneAccountB0 = 133aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.builder( 134aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new PhoneAccountHandle( 1351b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceComponentNameB, 136aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "id B 0"), 137aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "Phone account service B ID 0") 138aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addSupportedUriScheme("tel") 139aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .setCapabilities( 140aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_CALL_PROVIDER | 141aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) 142aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .build(); 143aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 144aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ConnectionServiceFixture mConnectionServiceFixtureA; 145aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ConnectionServiceFixture mConnectionServiceFixtureB; 146aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 147abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad CallerInfoAsyncQueryFactoryFixture mCallerInfoAsyncQueryFactoryFixture; 148abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 1498fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu IAudioService mAudioService; 1508fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 151aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad TelecomSystem mTelecomSystem; 152aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 1531b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad class IdPair { 1541b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad final String mConnectionId; 1551b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad final String mCallId; 1561b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 1571b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public IdPair(String connectionId, String callId) { 1581b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad this.mConnectionId = connectionId; 1591b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad this.mCallId = callId; 1601b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 1611b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 1621b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 163aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Override 164aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad public void setUp() throws Exception { 165aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad super.setUp(); 166aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 167aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // First set up information about the In-Call services in the mock Context, since 168aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Telecom will search for these as soon as it is instantiated 169aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad setupInCallServices(); 170aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 171aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Next, create the TelecomSystem, our system under test 172aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad setupTelecomSystem(); 173aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 174aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Finally, register the ConnectionServices with the PhoneAccountRegistrar of the 175aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // now-running TelecomSystem 176aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad setupConnectionServices(); 177aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 178aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 179aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Override 180aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad public void tearDown() throws Exception { 181aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem = null; 182aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad super.tearDown(); 183aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 184aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 185aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad private void setupTelecomSystem() throws Exception { 186aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad HeadsetMediaButtonFactory headsetMediaButtonFactory = 187aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mock(HeadsetMediaButtonFactory.class); 188aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ProximitySensorManagerFactory proximitySensorManagerFactory = 189aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mock(ProximitySensorManagerFactory.class); 190aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad InCallWakeLockControllerFactory inCallWakeLockControllerFactory = 191aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mock(InCallWakeLockControllerFactory.class); 1928fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu mAudioService = setupAudioService(); 193aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 194abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad mCallerInfoAsyncQueryFactoryFixture = new CallerInfoAsyncQueryFactoryFixture(); 195abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 196aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad when(headsetMediaButtonFactory.create( 197aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(Context.class), 198731369c3983628e700f161138fe2ea3230033a1aIhab Awad any(CallsManager.class), 199731369c3983628e700f161138fe2ea3230033a1aIhab Awad any(TelecomSystem.SyncRoot.class))) 200aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .thenReturn(mHeadsetMediaButton); 201aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad when(proximitySensorManagerFactory.create( 202aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(Context.class), 203aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(CallsManager.class))) 204aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .thenReturn(mProximitySensorManager); 205aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad when(inCallWakeLockControllerFactory.create( 206aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(Context.class), 207aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(CallsManager.class))) 208aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .thenReturn(mInCallWakeLockController); 209aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 210aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem = new TelecomSystem( 211aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.getTestDouble(), 212aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mMissedCallNotifier, 213abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad mCallerInfoAsyncQueryFactoryFixture.getTestDouble(), 214aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad headsetMediaButtonFactory, 215aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad proximitySensorManagerFactory, 2168fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu inCallWakeLockControllerFactory, 2178fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu new CallAudioManager.AudioServiceFactory() { 2188fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu @Override 2198fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu public IAudioService getAudioService() { 2208fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu return mAudioService; 2218fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 2228fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu }); 223aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 2241d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu mComponentContextFixture.setTelecomManager(new TelecomManager( 2251d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu mComponentContextFixture.getTestDouble(), 2261d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu mTelecomSystem.getTelecomServiceImpl().getBinder())); 2271d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu 228aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(headsetMediaButtonFactory).create( 229aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(mComponentContextFixture.getTestDouble().getApplicationContext()), 230731369c3983628e700f161138fe2ea3230033a1aIhab Awad any(CallsManager.class), 231731369c3983628e700f161138fe2ea3230033a1aIhab Awad any(TelecomSystem.SyncRoot.class)); 232aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(proximitySensorManagerFactory).create( 233aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(mComponentContextFixture.getTestDouble().getApplicationContext()), 234aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(CallsManager.class)); 235aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(inCallWakeLockControllerFactory).create( 236aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(mComponentContextFixture.getTestDouble().getApplicationContext()), 237aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(CallsManager.class)); 238aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 239aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 240aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad private void setupConnectionServices() throws Exception { 241aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureA = new ConnectionServiceFixture(); 242aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureB = new ConnectionServiceFixture(); 243aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 244aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.addConnectionService( 245aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceComponentNameA, 246aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureA.getTestDouble()); 247aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.addConnectionService( 248aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceComponentNameB, 249aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureB.getTestDouble()); 250aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 251aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountA0); 252aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountA1); 253aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountB0); 2540a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad 2550a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().setUserSelectedOutgoingPhoneAccount( 2560a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad mPhoneAccountA0.getAccountHandle()); 257aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 258aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 259aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad private void setupInCallServices() throws Exception { 260aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.putResource( 261aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad com.android.server.telecom.R.string.ui_default_package, 262aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceComponentNameX.getPackageName()); 263aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.putResource( 264aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad com.android.server.telecom.R.string.incall_default_class, 265aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceComponentNameX.getClassName()); 266aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 267aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureX = new InCallServiceFixture(); 268aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureY = new InCallServiceFixture(); 269aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 270aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.addInCallService( 271aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceComponentNameX, 272aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureX.getTestDouble()); 273aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.addInCallService( 274aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceComponentNameY, 275aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureY.getTestDouble()); 276aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 277aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 2788fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu /** 2798fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * Helper method for setting up the fake audio service. 2808fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * Calls to the fake audio service need to toggle the return 2818fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * value of AudioManager#isMicrophoneMute. 2828fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * @return mock of IAudioService 2838fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu */ 2848fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu private IAudioService setupAudioService() { 2858fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu IAudioService audioService = mock(IAudioService.class); 2868fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu final AudioManager fakeAudioManager = 2878fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu (AudioManager) mComponentContextFixture.getTestDouble() 2888fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu .getApplicationContext().getSystemService(Context.AUDIO_SERVICE); 2898fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 2908fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu try { 2918fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu doAnswer(new Answer() { 2928fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu @Override 2938fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu public Object answer(InvocationOnMock i) { 2948fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu Object[] args = i.getArguments(); 2958fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu doReturn(args[0]).when(fakeAudioManager).isMicrophoneMute(); 2968fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu return null; 2978fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 2988fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu }).when(audioService) 2998fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu .setMicrophoneMute(any(Boolean.class), any(String.class), any(Integer.class)); 3008fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 3018fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } catch (android.os.RemoteException e) { 3028fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu // Do nothing, leave the faked microphone state as-is 3038fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 3048fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu return audioService; 3058fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 3068fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 3071b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad private IdPair startOutgoingPhoneCall( 308aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad String number, 309aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccountHandle phoneAccountHandle, 310aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ConnectionServiceFixture connectionServiceFixture) throws Exception { 3111b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad reset( 3121b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.getTestDouble(), 3131b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.getTestDouble(), 3141b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.getTestDouble()); 3151b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 3161b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals( 3171b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mCallById.size(), 3181b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.mCallById.size()); 3191b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals( 3201b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad (mInCallServiceFixtureX.mInCallAdapter != null), 3211b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad (mInCallServiceFixtureY.mInCallAdapter != null)); 3221b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 3231b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad int startingNumConnections = connectionServiceFixture.mConnectionById.size(); 3241b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad int startingNumCalls = mInCallServiceFixtureX.mCallById.size(); 3251b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad boolean hasInCallAdapter = mInCallServiceFixtureX.mInCallAdapter != null; 3261b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 327aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad Intent actionCallIntent = new Intent(); 328aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.setData(Uri.parse("tel:" + number)); 329aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number); 330aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.setAction(Intent.ACTION_CALL); 331aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad if (phoneAccountHandle != null) { 332aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.putExtra( 333aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, 334aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad phoneAccountHandle); 335aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 336aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 337aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getCallIntentProcessor().processIntent(actionCallIntent); 338aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 3391b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad if (!hasInCallAdapter) { 3401b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad verify(mInCallServiceFixtureX.getTestDouble()) 3411b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad .setInCallAdapter( 3421b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad any(IInCallAdapter.class)); 3431b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad verify(mInCallServiceFixtureY.getTestDouble()) 3441b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad .setInCallAdapter( 3451b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad any(IInCallAdapter.class)); 3461b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 3471b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 348aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor<Intent> newOutgoingCallIntent = 349aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor.forClass(Intent.class); 350aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor<BroadcastReceiver> newOutgoingCallReceiver = 351aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor.forClass(BroadcastReceiver.class); 352aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 353aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(mComponentContextFixture.getTestDouble().getApplicationContext()) 354aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .sendOrderedBroadcastAsUser( 355aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallIntent.capture(), 356aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(UserHandle.class), 357aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyString(), 3580a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad anyInt(), 359aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallReceiver.capture(), 360aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(Handler.class), 361aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyInt(), 362aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyString(), 363aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(Bundle.class)); 364aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 365aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Pass on the new outgoing call Intent 366aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Set a dummy PendingResult so the BroadcastReceiver agrees to accept onReceive() 367aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallReceiver.getValue().setPendingResult( 368d240fe8e16205623eb6cb73c3d42448554690033Rekha Kumar new BroadcastReceiver.PendingResult(0, "", null, 0, true, false, null, 0, 0)); 369aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallReceiver.getValue().setResultData( 370aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallIntent.getValue().getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 371aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallReceiver.getValue().onReceive( 372aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.getTestDouble(), 373aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallIntent.getValue()); 374aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 3751b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(startingNumConnections + 1, connectionServiceFixture.mConnectionById.size()); 3761b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 377aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(connectionServiceFixture.getTestDouble()).createConnection( 378aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(phoneAccountHandle), 379aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyString(), 380aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(ConnectionRequest.class), 381aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyBoolean(), 382aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyBoolean()); 383aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 3841b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendHandleCreateConnectionComplete( 3851b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.mLatestConnectionId); 386aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 3871b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(startingNumCalls + 1, mInCallServiceFixtureX.mCallById.size()); 3881b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(startingNumCalls + 1, mInCallServiceFixtureY.mCallById.size()); 389aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 3901b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals( 3911b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mLatestCallId, 3921b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.mLatestCallId); 3931b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 3941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad return new IdPair( 3951b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.mLatestConnectionId, 3961b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mLatestCallId); 397aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 398aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 3991b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad private IdPair startIncomingPhoneCall( 400aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad String number, 401aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccountHandle phoneAccountHandle, 40232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad final ConnectionServiceFixture connectionServiceFixture) throws Exception { 4031b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad reset( 4041b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.getTestDouble(), 4051b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.getTestDouble(), 4061b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.getTestDouble()); 4071b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 4081b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals( 4091b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mCallById.size(), 4101b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.mCallById.size()); 4111b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals( 4121b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad (mInCallServiceFixtureX.mInCallAdapter != null), 4131b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad (mInCallServiceFixtureY.mInCallAdapter != null)); 4141b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 41532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad final int startingNumConnections = connectionServiceFixture.mConnectionById.size(); 41632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad final int startingNumCalls = mInCallServiceFixtureX.mCallById.size(); 4171b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad boolean hasInCallAdapter = mInCallServiceFixtureX.mInCallAdapter != null; 4181b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 419aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad Bundle extras = new Bundle(); 420aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad extras.putParcelable( 42169fa89790a67c497f091c86a9b1ed5a00aace7aeYorke Lee TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, 422aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null)); 423aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getTelecomServiceImpl().getBinder() 424aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addNewIncomingCall(phoneAccountHandle, extras); 425aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 426aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(connectionServiceFixture.getTestDouble()).createConnection( 427aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(PhoneAccountHandle.class), 428aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyString(), 429aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(ConnectionRequest.class), 430aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(true), 431aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(false)); 432aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 4331b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendHandleCreateConnectionComplete( 4341b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.mLatestConnectionId); 4351b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendSetRinging( 4361b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.mLatestConnectionId); 437aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 438aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // For the case of incoming calls, Telecom connecting the InCall services and adding the 439aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Call is triggered by the async completion of the CallerInfoAsyncQuery. Once the Call 440aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // is added, future interactions as triggered by the ConnectionService, through the various 441aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // test fixtures, will be synchronous. 442aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 4431b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad if (!hasInCallAdapter) { 4441b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad verify( 4451b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.getTestDouble(), 4461b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad timeout(TEST_TIMEOUT)) 4471b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad .setInCallAdapter( 4481b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad any(IInCallAdapter.class)); 4491b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad verify( 4501b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.getTestDouble(), 4511b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad timeout(TEST_TIMEOUT)) 4521b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad .setInCallAdapter( 4531b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad any(IInCallAdapter.class)); 4541b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 4551b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 4561b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // Give the InCallService time to respond 457aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 45832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 45932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 46032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 46132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return mInCallServiceFixtureX.mInCallAdapter != null; 46232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 46332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 46432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad 46532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 46632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 46732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 46832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return mInCallServiceFixtureY.mInCallAdapter != null; 46932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 47032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 471aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 472aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify( 473aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureX.getTestDouble(), 474aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad timeout(TEST_TIMEOUT)) 475aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addCall( 476aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(ParcelableCall.class)); 477aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify( 478aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureY.getTestDouble(), 479aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad timeout(TEST_TIMEOUT)) 480aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addCall( 481aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(ParcelableCall.class)); 482aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 4831b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // Give the InCallService time to respond 4841b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 48532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 48632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 48732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 48832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return startingNumConnections + 1 == 48932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad connectionServiceFixture.mConnectionById.size(); 49032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 49132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 49232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 49332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 49432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 49532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return startingNumCalls + 1 == mInCallServiceFixtureX.mCallById.size(); 49632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 49732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 49832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 49932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 50032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 50132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return startingNumCalls + 1 == mInCallServiceFixtureY.mCallById.size(); 50232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 50332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 5041b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 5051b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals( 5061b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mLatestCallId, 5071b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.mLatestCallId); 5081b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 5091b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad return new IdPair( 5101b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.mLatestConnectionId, 5111b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mLatestCallId); 512aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 513aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 514abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad private void rapidFire(Runnable... tasks) { 515abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad final CyclicBarrier barrier = new CyclicBarrier(tasks.length); 516abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad final CountDownLatch latch = new CountDownLatch(tasks.length); 517abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad for (int i = 0; i < tasks.length; i++) { 518abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad final Runnable task = tasks[i]; 519abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad new Thread(new Runnable() { 520abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad @Override 521abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad public void run() { 522abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad try { 523abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad barrier.await(); 524abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad task.run(); 525abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } catch (InterruptedException | BrokenBarrierException e){ 526abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad Log.e(TelecomSystemTest.this, e, "Unexpectedly interrupted"); 527abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } finally { 528abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad latch.countDown(); 529abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 530abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 531abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad }).start(); 532abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 533abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad try { 534abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad latch.await(); 535abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } catch (InterruptedException e) { 536abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad Log.e(TelecomSystemTest.this, e, "Unexpectedly interrupted"); 537abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 538abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 539abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 540aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // A simple outgoing call, verifying that the appropriate connection service is contacted, 541aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // the proper lifecycle is followed, and both In-Call Services are updated correctly. 5421b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad private IdPair startAndMakeActiveOutgoingCall( 5431b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad String number, 5441b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad PhoneAccountHandle phoneAccountHandle, 5451b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad ConnectionServiceFixture connectionServiceFixture) throws Exception { 5461b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair ids = startOutgoingPhoneCall(number, phoneAccountHandle, connectionServiceFixture); 547aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5481b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendSetDialing(ids.mConnectionId); 5491b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_DIALING, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 5501b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_DIALING, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 551aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5521b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendSetActive(ids.mConnectionId); 5531b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 5541b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 555aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5561b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad return ids; 5571b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 5580a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad 5591b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public void testSingleOutgoingCallLocalDisconnect() throws Exception { 5601b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair ids = startAndMakeActiveOutgoingCall( 5611b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad "650-555-1212", 5621b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mPhoneAccountA0.getAccountHandle(), 5631b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA); 564aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5651b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mInCallAdapter.disconnectCall(ids.mCallId); 5661b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 5671b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 568aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5691b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA.sendSetDisconnected(ids.mConnectionId, DisconnectCause.LOCAL); 57032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 57132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 57232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 57332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 574aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 575aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5761b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public void testSingleOutgoingCallRemoteDisconnect() throws Exception { 5771b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair ids = startAndMakeActiveOutgoingCall( 578aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "650-555-1212", 579aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mPhoneAccountA0.getAccountHandle(), 580aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureA); 581aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5821b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA.sendSetDisconnected(ids.mConnectionId, DisconnectCause.LOCAL); 58332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 58432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 58532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 58632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 5871b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 588aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5891b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // A simple incoming call, similar in scope to the previous test 5901b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad private IdPair startAndMakeActiveIncomingCall( 5911b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad String number, 5921b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad PhoneAccountHandle phoneAccountHandle, 5931b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad ConnectionServiceFixture connectionServiceFixture) throws Exception { 5941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair ids = startIncomingPhoneCall(number, phoneAccountHandle, connectionServiceFixture); 595aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5961b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_RINGING, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 5971b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_RINGING, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 598aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 59932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureX.mInCallAdapter 60032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad .answerCall(ids.mCallId, VideoProfile.STATE_AUDIO_ONLY); 60132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad 60232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad verify(connectionServiceFixture.getTestDouble()) 60332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad .answer(ids.mConnectionId); 60432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad 6051b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendSetActive(ids.mConnectionId); 6061b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 6071b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 608aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 6091b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad return ids; 6101b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 611aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 6121b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public void testSingleIncomingCallLocalDisconnect() throws Exception { 6131b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair ids = startAndMakeActiveIncomingCall( 6141b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad "650-555-1212", 6151b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mPhoneAccountA0.getAccountHandle(), 6161b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA); 6171b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 6181b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mInCallAdapter.disconnectCall(ids.mCallId); 6191b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 6201b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 6211b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 6221b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA.sendSetDisconnected(ids.mConnectionId, DisconnectCause.LOCAL); 62332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 62432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 62532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 62632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 627aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 628abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 6291b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public void testSingleIncomingCallRemoteDisconnect() throws Exception { 6301b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair ids = startAndMakeActiveIncomingCall( 6311b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad "650-555-1212", 6321b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mPhoneAccountA0.getAccountHandle(), 6331b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA); 6341b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 6351b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA.sendSetDisconnected(ids.mConnectionId, DisconnectCause.LOCAL); 63632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 63732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 63832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals(Call.STATE_DISCONNECTED, 63932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 640abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 641abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 642abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad public void do_testDeadlockOnOutgoingCall() throws Exception { 6431b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad final IdPair ids = startOutgoingPhoneCall( 644abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad "650-555-1212", 645abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad mPhoneAccountA0.getAccountHandle(), 646abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad mConnectionServiceFixtureA); 647abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad rapidFire( 648abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad new Runnable() { 649abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad @Override 650abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad public void run() { 651abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad while (mCallerInfoAsyncQueryFactoryFixture.mRequests.size() > 0) { 652abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad mCallerInfoAsyncQueryFactoryFixture.mRequests.remove(0).reply(); 653abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 654abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 655abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad }, 656abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad new Runnable() { 657abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad @Override 658abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad public void run() { 659abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad try { 6601b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA.sendSetActive(ids.mConnectionId); 661abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } catch (Exception e) { 662abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad Log.e(this, e, ""); 663abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 664abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 665abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad }); 666abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 6671b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 6681b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public void testDeadlockOnOutgoingCall() throws Exception { 6691b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad for (int i = 0; i < 100; i++) { 6701b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad TelecomSystemTest test = new TelecomSystemTest(); 6711b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad test.setContext(getContext()); 6721b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad test.setTestContext(getTestContext()); 6731b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad test.setName(getName()); 6741b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad test.setUp(); 6751b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad test.do_testDeadlockOnOutgoingCall(); 6761b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad test.tearDown(); 6771b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 6781b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 6791b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 6801b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public void testIncomingThenOutgoingCalls() throws Exception { 6811b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // TODO: We have to use the same PhoneAccount for both; see http://b/18461539 6821b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair incoming = startAndMakeActiveIncomingCall( 6831b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad "650-555-2323", 6841b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mPhoneAccountA0.getAccountHandle(), 6851b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA); 6861b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair outgoing = startAndMakeActiveOutgoingCall( 6871b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad "650-555-1212", 6881b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mPhoneAccountA0.getAccountHandle(), 6891b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA); 6901b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 6911b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 6921b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public void testOutgoingThenIncomingCalls() throws Exception { 6931b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // TODO: We have to use the same PhoneAccount for both; see http://b/18461539 6941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair outgoing = startAndMakeActiveOutgoingCall( 6951b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad "650-555-1212", 6961b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mPhoneAccountA0.getAccountHandle(), 6971b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA); 6981b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair incoming = startAndMakeActiveIncomingCall( 6991b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad "650-555-2323", 7001b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mPhoneAccountA0.getAccountHandle(), 7011b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceFixtureA); 70232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad verify(mConnectionServiceFixtureA.getTestDouble()) 70332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad .hold(outgoing.mConnectionId); 70432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mConnectionServiceFixtureA.mConnectionById.get(outgoing.mConnectionId).state = 70532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad Connection.STATE_HOLDING; 70632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mConnectionServiceFixtureA.sendSetOnHold(outgoing.mConnectionId); 70732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals( 70832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad Call.STATE_HOLDING, 70932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureX.getCall(outgoing.mCallId).getState()); 71032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertEquals( 71132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad Call.STATE_HOLDING, 71232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureY.getCall(outgoing.mCallId).getState()); 7131b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 7141b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 715b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad public void testAudioManagerOperations() throws Exception { 716b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad AudioManager audioManager = (AudioManager) mComponentContextFixture.getTestDouble() 717b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad .getApplicationContext().getSystemService(Context.AUDIO_SERVICE); 718b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad 719b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad IdPair outgoing = startAndMakeActiveOutgoingCall( 720b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad "650-555-1212", 721b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad mPhoneAccountA0.getAccountHandle(), 722b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad mConnectionServiceFixtureA); 723b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad 724b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad verify(audioManager, timeout(TEST_TIMEOUT)) 725b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad .requestAudioFocusForCall(anyInt(), anyInt()); 726b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad verify(audioManager, timeout(TEST_TIMEOUT).atLeastOnce()) 727b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad .setMode(AudioManager.MODE_IN_CALL); 728b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad 729b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad mInCallServiceFixtureX.mInCallAdapter.mute(true); 7308fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu verify(mAudioService, timeout(TEST_TIMEOUT)) 7318fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu .setMicrophoneMute(eq(true), any(String.class), any(Integer.class)); 732b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad mInCallServiceFixtureX.mInCallAdapter.mute(false); 7338fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu verify(mAudioService, timeout(TEST_TIMEOUT)) 7348fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu .setMicrophoneMute(eq(false), any(String.class), any(Integer.class)); 735b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad 736b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad mInCallServiceFixtureX.mInCallAdapter.setAudioRoute(CallAudioState.ROUTE_SPEAKER); 737b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad verify(audioManager, timeout(TEST_TIMEOUT)) 738b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad .setSpeakerphoneOn(true); 739b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad mInCallServiceFixtureX.mInCallAdapter.setAudioRoute(CallAudioState.ROUTE_EARPIECE); 740b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad verify(audioManager, timeout(TEST_TIMEOUT)) 741b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad .setSpeakerphoneOn(false); 742b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad 743b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad mConnectionServiceFixtureA. 744b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad sendSetDisconnected(outgoing.mConnectionId, DisconnectCause.REMOTE); 745b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad 746b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad verify(audioManager, timeout(TEST_TIMEOUT)) 747b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad .abandonAudioFocusForCall(); 748b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad verify(audioManager, timeout(TEST_TIMEOUT).atLeastOnce()) 749b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad .setMode(AudioManager.MODE_NORMAL); 750b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad } 751b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad 75232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad protected static void assertTrueWithTimeout(Predicate<Void> predicate) { 75332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad int elapsed = 0; 75432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad while (elapsed < TEST_TIMEOUT) { 75532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad if (predicate.apply(null)) { 75632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return; 75732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } else { 75832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad try { 75932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad Thread.sleep(TEST_POLL_INTERVAL); 76032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad elapsed += TEST_POLL_INTERVAL; 76132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } catch (InterruptedException e) { 76232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad fail(e.toString()); 76332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 76432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 7651b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 76632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad fail("Timeout in assertTrueWithTimeout"); 7671b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 768aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad} 769