TelecomSystemTest.java revision c6e42ef0465fe01b35bb3aa94fbcbc081e3b45ed
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; 25c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastryimport static org.mockito.Matchers.isNull; 268fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport static org.mockito.Mockito.doAnswer; 278fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport static org.mockito.Mockito.doReturn; 2892694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Mockito.mock; 291b5490ac8643a5969adaba6f68d872acd251d666Ihab Awadimport static org.mockito.Mockito.reset; 30ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunnimport static org.mockito.Mockito.spy; 3192694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Mockito.timeout; 32f7783fb45c262a36d813cb450062d0076490a530Hall Liuimport static org.mockito.Mockito.times; 3392694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport static org.mockito.Mockito.verify; 3492694519535c54f542b4ef3973e9c1934f2feeffSantos Cordon 3592694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.BroadcastReceiver; 3692694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.ComponentName; 3792694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.Context; 38c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastryimport android.content.IContentProvider; 3992694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.content.Intent; 40b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awadimport android.media.AudioManager; 418fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport android.media.IAudioService; 4292694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.net.Uri; 4392694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.os.Bundle; 4492694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.os.Handler; 45578a4e6661fc1be20d164458acb335356d742f72Tony Makimport android.os.Process; 4692694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.os.UserHandle; 47c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastryimport android.provider.BlockedNumberContract; 480a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awadimport android.telecom.Call; 4992694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.ConnectionRequest; 5092694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.ParcelableCall; 5192694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.PhoneAccount; 5292694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.PhoneAccountHandle; 5392694519535c54f542b4ef3973e9c1934f2feeffSantos Cordonimport android.telecom.TelecomManager; 5432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awadimport android.telecom.VideoProfile; 5592694519535c54f542b4ef3973e9c1934f2feeffSantos Cordon 56aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport com.android.internal.telecom.IInCallAdapter; 57b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liuimport com.android.server.telecom.BluetoothPhoneServiceImpl; 58b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastryimport com.android.server.telecom.CallAudioManager; 59ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunnimport com.android.server.telecom.CallerInfoAsyncQueryFactory; 602c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.CallsManager; 61ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunnimport com.android.server.telecom.CallsManagerListenerBase; 62ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunnimport com.android.server.telecom.ContactsAsyncHelper; 632c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.HeadsetMediaButton; 642c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.HeadsetMediaButtonFactory; 652c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.InCallWakeLockController; 662c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.InCallWakeLockControllerFactory; 672c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.MissedCallNotifier; 68b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liuimport com.android.server.telecom.PhoneAccountRegistrar; 692c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.ProximitySensorManager; 702c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.ProximitySensorManagerFactory; 712c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.TelecomSystem; 72578a4e6661fc1be20d164458acb335356d742f72Tony Makimport com.android.server.telecom.components.UserCallIntentProcessor; 73a993094840386163e9c2aa65a05e14b49d122318Tony Makimport com.android.server.telecom.ui.MissedCallNotifierImpl.MissedCallNotifierImplFactory; 74aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 758fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport com.google.common.base.Predicate; 768fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 77aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport org.mockito.ArgumentCaptor; 78aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport org.mockito.Mock; 798fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport org.mockito.invocation.InvocationOnMock; 808fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liuimport org.mockito.stubbing.Answer; 81aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 82c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastryimport java.util.ArrayList; 83c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastryimport java.util.List; 84c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry 85b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn/** 86b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn * Implements mocks and functionality required to implement telecom system tests. 87b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn */ 88aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadpublic class TelecomSystemTest extends TelecomTestCase { 89aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 9032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad static final int TEST_POLL_INTERVAL = 10; // milliseconds 91aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad static final int TEST_TIMEOUT = 1000; // milliseconds 92aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 93ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public class HeadsetMediaButtonFactoryF implements HeadsetMediaButtonFactory { 94ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn @Override 95ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public HeadsetMediaButton create(Context context, CallsManager callsManager, 96ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn TelecomSystem.SyncRoot lock) { 97ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn return mHeadsetMediaButton; 98ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 99ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 100ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 101ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public class ProximitySensorManagerFactoryF implements ProximitySensorManagerFactory { 102ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn @Override 103ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public ProximitySensorManager create(Context context, CallsManager callsManager) { 104ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn return mProximitySensorManager; 105ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 106ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 107ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 108ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public class InCallWakeLockControllerFactoryF implements InCallWakeLockControllerFactory { 109ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn @Override 110ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public InCallWakeLockController create(Context context, CallsManager callsManager) { 111ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn return mInCallWakeLockController; 112ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 113ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 114ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 115ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public static class MissedCallNotifierFakeImpl extends CallsManagerListenerBase 116ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn implements MissedCallNotifier { 117c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry List<com.android.server.telecom.Call> missedCallsNotified = new ArrayList<>(); 118c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry 119ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn @Override 120a993094840386163e9c2aa65a05e14b49d122318Tony Mak public void clearMissedCalls(UserHandle userHandle) { 121ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 122ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 123ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 124ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn @Override 125ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn public void showMissedCallNotification(com.android.server.telecom.Call call) { 126c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry missedCallsNotified.add(call); 127ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 128ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 129ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn @Override 130a993094840386163e9c2aa65a05e14b49d122318Tony Mak public void reloadFromDatabase(TelecomSystem.SyncRoot lock, CallsManager callsManager, 131ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn ContactsAsyncHelper contactsAsyncHelper, 132a993094840386163e9c2aa65a05e14b49d122318Tony Mak CallerInfoAsyncQueryFactory callerInfoAsyncQueryFactory, UserHandle userHandle) { 133a993094840386163e9c2aa65a05e14b49d122318Tony Mak 134a993094840386163e9c2aa65a05e14b49d122318Tony Mak } 135a993094840386163e9c2aa65a05e14b49d122318Tony Mak 136a993094840386163e9c2aa65a05e14b49d122318Tony Mak @Override 137a993094840386163e9c2aa65a05e14b49d122318Tony Mak public void setCurrentUserHandle(UserHandle userHandle) { 138ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 139ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 140ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn } 141ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 142c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry MissedCallNotifierFakeImpl mMissedCallNotifier = new MissedCallNotifierFakeImpl(); 143aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Mock HeadsetMediaButton mHeadsetMediaButton; 144aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Mock ProximitySensorManager mProximitySensorManager; 145aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Mock InCallWakeLockController mInCallWakeLockController; 146b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu @Mock BluetoothPhoneServiceImpl mBluetoothPhoneServiceImpl; 147aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 148aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mInCallServiceComponentNameX = 149aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 150aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-package-X", 151aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-class-X"); 152aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mInCallServiceComponentNameY = 153aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 154aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-package-Y", 155aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "incall-service-class-Y"); 156aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 157aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad InCallServiceFixture mInCallServiceFixtureX; 158aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad InCallServiceFixture mInCallServiceFixtureY; 159aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 160aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mConnectionServiceComponentNameA = 161aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 162aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-package-A", 163aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-class-A"); 164aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final ComponentName mConnectionServiceComponentNameB = 165aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new ComponentName( 166aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-package-B", 167aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "connection-service-class-B"); 168aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 169aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final PhoneAccount mPhoneAccountA0 = 170aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.builder( 171aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new PhoneAccountHandle( 172aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceComponentNameA, 173aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "id A 0"), 174aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "Phone account service A ID 0") 175aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addSupportedUriScheme("tel") 176aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .setCapabilities( 177aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_CALL_PROVIDER | 178aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) 179aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .build(); 180aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final PhoneAccount mPhoneAccountA1 = 181aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.builder( 182aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new PhoneAccountHandle( 183aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceComponentNameA, 184aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "id A 1"), 185aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "Phone account service A ID 1") 186aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addSupportedUriScheme("tel") 187aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .setCapabilities( 188aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_CALL_PROVIDER | 189aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) 190aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .build(); 191aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad final PhoneAccount mPhoneAccountB0 = 192aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.builder( 193aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad new PhoneAccountHandle( 1941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mConnectionServiceComponentNameB, 195aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "id B 0"), 196aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad "Phone account service B ID 0") 197aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addSupportedUriScheme("tel") 198aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .setCapabilities( 199aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_CALL_PROVIDER | 200aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) 201aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .build(); 202aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 203aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ConnectionServiceFixture mConnectionServiceFixtureA; 204aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ConnectionServiceFixture mConnectionServiceFixtureB; 205aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 206abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad CallerInfoAsyncQueryFactoryFixture mCallerInfoAsyncQueryFactoryFixture; 207abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 2088fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu IAudioService mAudioService; 2098fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 210aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad TelecomSystem mTelecomSystem; 211aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 212ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu Context mSpyContext; 213ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu 214f7783fb45c262a36d813cb450062d0076490a530Hall Liu private int mNumOutgoingCallsMade; 215f7783fb45c262a36d813cb450062d0076490a530Hall Liu 2161b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad class IdPair { 2171b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad final String mConnectionId; 2181b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad final String mCallId; 2191b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 2201b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad public IdPair(String connectionId, String callId) { 2211b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad this.mConnectionId = connectionId; 2221b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad this.mCallId = callId; 2231b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 2241b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 2251b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 226aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Override 227aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad public void setUp() throws Exception { 228aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad super.setUp(); 229ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu mSpyContext = mComponentContextFixture.getTestDouble().getApplicationContext(); 230ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu doReturn(mSpyContext).when(mSpyContext).getApplicationContext(); 231ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu 232f7783fb45c262a36d813cb450062d0076490a530Hall Liu mNumOutgoingCallsMade = 0; 233aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 234aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // First set up information about the In-Call services in the mock Context, since 235aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Telecom will search for these as soon as it is instantiated 236aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad setupInCallServices(); 237aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 238aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Next, create the TelecomSystem, our system under test 239aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad setupTelecomSystem(); 240aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 241aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Finally, register the ConnectionServices with the PhoneAccountRegistrar of the 242aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // now-running TelecomSystem 243aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad setupConnectionServices(); 244aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 245aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 246aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad @Override 247aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad public void tearDown() throws Exception { 248aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem = null; 249aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad super.tearDown(); 250aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 251aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 252aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad private void setupTelecomSystem() throws Exception { 253ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn // Use actual implementations instead of mocking the interface out. 254aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad HeadsetMediaButtonFactory headsetMediaButtonFactory = 255ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn spy(new HeadsetMediaButtonFactoryF()); 256aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ProximitySensorManagerFactory proximitySensorManagerFactory = 257ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn spy(new ProximitySensorManagerFactoryF()); 258aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad InCallWakeLockControllerFactory inCallWakeLockControllerFactory = 259ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn spy(new InCallWakeLockControllerFactoryF()); 2608fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu mAudioService = setupAudioService(); 261aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 262abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad mCallerInfoAsyncQueryFactoryFixture = new CallerInfoAsyncQueryFactoryFixture(); 263abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 264aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem = new TelecomSystem( 265aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.getTestDouble(), 266a993094840386163e9c2aa65a05e14b49d122318Tony Mak new MissedCallNotifierImplFactory() { 267a993094840386163e9c2aa65a05e14b49d122318Tony Mak @Override 268a993094840386163e9c2aa65a05e14b49d122318Tony Mak public MissedCallNotifier makeMissedCallNotifierImpl(Context context, 269a993094840386163e9c2aa65a05e14b49d122318Tony Mak PhoneAccountRegistrar phoneAccountRegistrar) { 270a993094840386163e9c2aa65a05e14b49d122318Tony Mak return mMissedCallNotifier; 271a993094840386163e9c2aa65a05e14b49d122318Tony Mak } 272a993094840386163e9c2aa65a05e14b49d122318Tony Mak }, 273abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad mCallerInfoAsyncQueryFactoryFixture.getTestDouble(), 274aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad headsetMediaButtonFactory, 275aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad proximitySensorManagerFactory, 2768fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu inCallWakeLockControllerFactory, 2778fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu new CallAudioManager.AudioServiceFactory() { 2788fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu @Override 2798fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu public IAudioService getAudioService() { 2808fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu return mAudioService; 2818fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 282b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu }, 283b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu new BluetoothPhoneServiceImpl.BluetoothPhoneServiceImplFactory() { 284b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu @Override 285b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu public BluetoothPhoneServiceImpl makeBluetoothPhoneServiceImpl(Context context, 286b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu TelecomSystem.SyncRoot lock, CallsManager callsManager, 287b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu PhoneAccountRegistrar phoneAccountRegistrar) { 288b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu return mBluetoothPhoneServiceImpl; 289b3979ee8e636820cc5e68f26562bc02987e5d489Hall Liu } 2908fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu }); 291aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 2921d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu mComponentContextFixture.setTelecomManager(new TelecomManager( 2931d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu mComponentContextFixture.getTestDouble(), 2941d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu mTelecomSystem.getTelecomServiceImpl().getBinder())); 2951d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu 296aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(headsetMediaButtonFactory).create( 297aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(mComponentContextFixture.getTestDouble().getApplicationContext()), 298731369c3983628e700f161138fe2ea3230033a1aIhab Awad any(CallsManager.class), 299731369c3983628e700f161138fe2ea3230033a1aIhab Awad any(TelecomSystem.SyncRoot.class)); 300aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(proximitySensorManagerFactory).create( 301aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(mComponentContextFixture.getTestDouble().getApplicationContext()), 302aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(CallsManager.class)); 303aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad verify(inCallWakeLockControllerFactory).create( 304aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad eq(mComponentContextFixture.getTestDouble().getApplicationContext()), 305aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(CallsManager.class)); 306aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 307aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 308aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad private void setupConnectionServices() throws Exception { 309aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureA = new ConnectionServiceFixture(); 310aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureB = new ConnectionServiceFixture(); 311aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 312b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn mComponentContextFixture.addConnectionService(mConnectionServiceComponentNameA, 313aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureA.getTestDouble()); 314b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn mComponentContextFixture.addConnectionService(mConnectionServiceComponentNameB, 315aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mConnectionServiceFixtureB.getTestDouble()); 316aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 317aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountA0); 318aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountA1); 319aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().registerPhoneAccount(mPhoneAccountB0); 3200a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad 3210a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad mTelecomSystem.getPhoneAccountRegistrar().setUserSelectedOutgoingPhoneAccount( 3224a3e2fd2b783c9f667a719237ef527ebe686fe32Tony Mak mPhoneAccountA0.getAccountHandle(), Process.myUserHandle()); 323aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 324aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 325aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad private void setupInCallServices() throws Exception { 326aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.putResource( 327aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad com.android.server.telecom.R.string.ui_default_package, 328aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceComponentNameX.getPackageName()); 329aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mComponentContextFixture.putResource( 330aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad com.android.server.telecom.R.string.incall_default_class, 331aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceComponentNameX.getClassName()); 332f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger mComponentContextFixture.putBooleanResource( 333f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger com.android.internal.R.bool.config_voice_capable, true); 334aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 335aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureX = new InCallServiceFixture(); 336aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureY = new InCallServiceFixture(); 337aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 338b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn mComponentContextFixture.addInCallService(mInCallServiceComponentNameX, 339aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureX.getTestDouble()); 340b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn mComponentContextFixture.addInCallService(mInCallServiceComponentNameY, 341aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mInCallServiceFixtureY.getTestDouble()); 342aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 343aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 3448fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu /** 3458fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * Helper method for setting up the fake audio service. 3468fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * Calls to the fake audio service need to toggle the return 3478fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * value of AudioManager#isMicrophoneMute. 3488fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu * @return mock of IAudioService 3498fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu */ 3508fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu private IAudioService setupAudioService() { 3518fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu IAudioService audioService = mock(IAudioService.class); 352ae694b10e9156cfe0c8c57d73989fed13c887f69Tyler Gunn 3538fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu final AudioManager fakeAudioManager = 3548fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu (AudioManager) mComponentContextFixture.getTestDouble() 3558fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu .getApplicationContext().getSystemService(Context.AUDIO_SERVICE); 3568fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 3578fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu try { 3588fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu doAnswer(new Answer() { 3598fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu @Override 3608fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu public Object answer(InvocationOnMock i) { 3618fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu Object[] args = i.getArguments(); 3628fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu doReturn(args[0]).when(fakeAudioManager).isMicrophoneMute(); 3638fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu return null; 3648fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 3658fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu }).when(audioService) 3668fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu .setMicrophoneMute(any(Boolean.class), any(String.class), any(Integer.class)); 3678fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 3688fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } catch (android.os.RemoteException e) { 3698fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu // Do nothing, leave the faked microphone state as-is 3708fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 3718fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu return audioService; 3728fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu } 3738fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu 374b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startOutgoingPhoneCall(String number, PhoneAccountHandle phoneAccountHandle, 375b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn ConnectionServiceFixture connectionServiceFixture, UserHandle initiatingUser) 376b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn throws Exception { 377b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn return startOutgoingPhoneCall(number, phoneAccountHandle, connectionServiceFixture, 378b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn initiatingUser, VideoProfile.STATE_AUDIO_ONLY); 379b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn } 380b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn 381b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startOutgoingPhoneCall(String number, PhoneAccountHandle phoneAccountHandle, 382b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn ConnectionServiceFixture connectionServiceFixture, UserHandle initiatingUser, 383b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn int videoState) throws Exception { 384b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn reset(connectionServiceFixture.getTestDouble(), mInCallServiceFixtureX.getTestDouble(), 3851b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.getTestDouble()); 3861b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 387b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn assertEquals(mInCallServiceFixtureX.mCallById.size(), 3881b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.mCallById.size()); 389b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn assertEquals((mInCallServiceFixtureX.mInCallAdapter != null), 3901b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad (mInCallServiceFixtureY.mInCallAdapter != null)); 3911b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 392f7783fb45c262a36d813cb450062d0076490a530Hall Liu mNumOutgoingCallsMade++; 3931b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad int startingNumConnections = connectionServiceFixture.mConnectionById.size(); 3941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad int startingNumCalls = mInCallServiceFixtureX.mCallById.size(); 3951b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad boolean hasInCallAdapter = mInCallServiceFixtureX.mInCallAdapter != null; 3961b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 397aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad Intent actionCallIntent = new Intent(); 398aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.setData(Uri.parse("tel:" + number)); 399aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number); 400aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.setAction(Intent.ACTION_CALL); 401aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad if (phoneAccountHandle != null) { 402aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad actionCallIntent.putExtra( 403aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, 404aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad phoneAccountHandle); 405aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 406b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn if (videoState != VideoProfile.STATE_AUDIO_ONLY) { 407b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn actionCallIntent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, videoState); 408b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn } 409aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 410578a4e6661fc1be20d164458acb335356d742f72Tony Mak final UserHandle userHandle = initiatingUser; 411f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger Context localAppContext = mComponentContextFixture.getTestDouble().getApplicationContext(); 412f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger new UserCallIntentProcessor(localAppContext, userHandle).processIntent( 413f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger actionCallIntent, null, true /* hasCallAppOp*/); 414f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger // UserCallIntentProcessor's mContext.sendBroadcastAsUser(...) will call to an empty method 415f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger // as to not actually try to send an intent to PrimaryCallReceiver. We verify that it was 416f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger // called correctly in order to continue. 417f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger verify(localAppContext).sendBroadcastAsUser(actionCallIntent, UserHandle.SYSTEM); 418aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getCallIntentProcessor().processIntent(actionCallIntent); 419aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 4201b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad if (!hasInCallAdapter) { 4211b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad verify(mInCallServiceFixtureX.getTestDouble()) 4221b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad .setInCallAdapter( 4231b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad any(IInCallAdapter.class)); 4241b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad verify(mInCallServiceFixtureY.getTestDouble()) 4251b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad .setInCallAdapter( 4261b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad any(IInCallAdapter.class)); 4271b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 4281b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 429aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor<Intent> newOutgoingCallIntent = 430aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor.forClass(Intent.class); 431aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor<BroadcastReceiver> newOutgoingCallReceiver = 432aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad ArgumentCaptor.forClass(BroadcastReceiver.class); 433aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 434f7783fb45c262a36d813cb450062d0076490a530Hall Liu verify(mComponentContextFixture.getTestDouble().getApplicationContext(), 435f7783fb45c262a36d813cb450062d0076490a530Hall Liu times(mNumOutgoingCallsMade)) 436aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .sendOrderedBroadcastAsUser( 437aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallIntent.capture(), 438aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(UserHandle.class), 439aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyString(), 4400a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad anyInt(), 441aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallReceiver.capture(), 442aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(Handler.class), 443aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyInt(), 444aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad anyString(), 445aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad any(Bundle.class)); 446aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 447aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Pass on the new outgoing call Intent 448aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Set a dummy PendingResult so the BroadcastReceiver agrees to accept onReceive() 449aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallReceiver.getValue().setPendingResult( 450d240fe8e16205623eb6cb73c3d42448554690033Rekha Kumar new BroadcastReceiver.PendingResult(0, "", null, 0, true, false, null, 0, 0)); 451aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallReceiver.getValue().setResultData( 452aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallIntent.getValue().getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 453b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn newOutgoingCallReceiver.getValue().onReceive(mComponentContextFixture.getTestDouble(), 454aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad newOutgoingCallIntent.getValue()); 455aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 4561b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(startingNumConnections + 1, connectionServiceFixture.mConnectionById.size()); 4571b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 458b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(connectionServiceFixture.getTestDouble()) 459b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .createConnection(eq(phoneAccountHandle), anyString(), any(ConnectionRequest.class), 460b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn anyBoolean(), anyBoolean()); 4611b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendHandleCreateConnectionComplete( 4621b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.mLatestConnectionId); 463aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 4641b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(startingNumCalls + 1, mInCallServiceFixtureX.mCallById.size()); 4651b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(startingNumCalls + 1, mInCallServiceFixtureY.mCallById.size()); 466aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 467b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn assertEquals(mInCallServiceFixtureX.mLatestCallId, mInCallServiceFixtureY.mLatestCallId); 4681b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 469b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn return new IdPair(connectionServiceFixture.mLatestConnectionId, 4701b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mLatestCallId); 471aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 472aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 473b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startIncomingPhoneCall( 474aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad String number, 475aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad PhoneAccountHandle phoneAccountHandle, 47632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad final ConnectionServiceFixture connectionServiceFixture) throws Exception { 47742ef808c284791f21be8675174acc7297418fa45Tyler Gunn return startIncomingPhoneCall(number, phoneAccountHandle, VideoProfile.STATE_AUDIO_ONLY, 47842ef808c284791f21be8675174acc7297418fa45Tyler Gunn connectionServiceFixture); 47942ef808c284791f21be8675174acc7297418fa45Tyler Gunn } 48042ef808c284791f21be8675174acc7297418fa45Tyler Gunn 481b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startIncomingPhoneCall( 48242ef808c284791f21be8675174acc7297418fa45Tyler Gunn String number, 48342ef808c284791f21be8675174acc7297418fa45Tyler Gunn PhoneAccountHandle phoneAccountHandle, 48442ef808c284791f21be8675174acc7297418fa45Tyler Gunn int videoState, 48542ef808c284791f21be8675174acc7297418fa45Tyler Gunn final ConnectionServiceFixture connectionServiceFixture) throws Exception { 486b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn reset(connectionServiceFixture.getTestDouble(), mInCallServiceFixtureX.getTestDouble(), 4871b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.getTestDouble()); 4881b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 489b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn assertEquals(mInCallServiceFixtureX.mCallById.size(), 4901b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureY.mCallById.size()); 491b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn assertEquals((mInCallServiceFixtureX.mInCallAdapter != null), 4921b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad (mInCallServiceFixtureY.mInCallAdapter != null)); 49332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad final int startingNumConnections = connectionServiceFixture.mConnectionById.size(); 49432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad final int startingNumCalls = mInCallServiceFixtureX.mCallById.size(); 4951b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad boolean hasInCallAdapter = mInCallServiceFixtureX.mInCallAdapter != null; 496b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry connectionServiceFixture.mConnectionServiceDelegate.mVideoState = videoState; 4971b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 498aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad Bundle extras = new Bundle(); 499aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad extras.putParcelable( 50069fa89790a67c497f091c86a9b1ed5a00aace7aeYorke Lee TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, 501aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null)); 502aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad mTelecomSystem.getTelecomServiceImpl().getBinder() 503aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad .addNewIncomingCall(phoneAccountHandle, extras); 504aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 505b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(connectionServiceFixture.getTestDouble()) 506b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .createConnection(any(PhoneAccountHandle.class), anyString(), 507b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn any(ConnectionRequest.class), eq(true), eq(false)); 508aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 509b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry for (CallerInfoAsyncQueryFactoryFixture.Request request : 510b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry mCallerInfoAsyncQueryFactoryFixture.mRequests) { 511b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry request.reply(); 512b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry } 513aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 514c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry IContentProvider blockedNumberProvider = 515c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry mSpyContext.getContentResolver().acquireProvider(BlockedNumberContract.AUTHORITY); 516c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry verify(blockedNumberProvider, timeout(TEST_TIMEOUT)).call( 517c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry anyString(), 518c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry eq(BlockedNumberContract.SystemContract.METHOD_SHOULD_SYSTEM_BLOCK_NUMBER), 519c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry eq(number), 520c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry isNull(Bundle.class)); 521c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry 522aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // For the case of incoming calls, Telecom connecting the InCall services and adding the 523aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // Call is triggered by the async completion of the CallerInfoAsyncQuery. Once the Call 524aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // is added, future interactions as triggered by the ConnectionService, through the various 525aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // test fixtures, will be synchronous. 526aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5271b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad if (!hasInCallAdapter) { 528b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(mInCallServiceFixtureX.getTestDouble(), timeout(TEST_TIMEOUT)) 529b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .setInCallAdapter(any(IInCallAdapter.class)); 530b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(mInCallServiceFixtureY.getTestDouble(), timeout(TEST_TIMEOUT)) 531b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .setInCallAdapter(any(IInCallAdapter.class)); 5321b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 5331b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 5341b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // Give the InCallService time to respond 535aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 53632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 53732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 53832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 53932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return mInCallServiceFixtureX.mInCallAdapter != null; 54032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 54132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 54232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad 54332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 54432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 54532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 54632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return mInCallServiceFixtureY.mInCallAdapter != null; 54732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 54832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 549aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 550b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(mInCallServiceFixtureX.getTestDouble(), timeout(TEST_TIMEOUT)) 551b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .addCall(any(ParcelableCall.class)); 552b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(mInCallServiceFixtureY.getTestDouble(), timeout(TEST_TIMEOUT)) 553b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .addCall(any(ParcelableCall.class)); 554aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 5551b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // Give the InCallService time to respond 5561b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 55732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 55832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 55932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 56032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return startingNumConnections + 1 == 56132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad connectionServiceFixture.mConnectionById.size(); 56232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 56332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 56432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 56532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 56632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 56732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return startingNumCalls + 1 == mInCallServiceFixtureX.mCallById.size(); 56832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 56932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 57032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad assertTrueWithTimeout(new Predicate<Void>() { 57132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad @Override 57232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad public boolean apply(Void v) { 57332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return startingNumCalls + 1 == mInCallServiceFixtureY.mCallById.size(); 57432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 57532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad }); 5761b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 577b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn assertEquals(mInCallServiceFixtureX.mLatestCallId, mInCallServiceFixtureY.mLatestCallId); 5781b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad 579b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn return new IdPair(connectionServiceFixture.mLatestConnectionId, 5801b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad mInCallServiceFixtureX.mLatestCallId); 581aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad } 582aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 583b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startAndMakeActiveOutgoingCall( 584b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn String number, 585b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn PhoneAccountHandle phoneAccountHandle, 586b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn ConnectionServiceFixture connectionServiceFixture) throws Exception { 587b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn return startAndMakeActiveOutgoingCall(number, phoneAccountHandle, connectionServiceFixture, 588b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn VideoProfile.STATE_AUDIO_ONLY); 589abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad } 590abcbce4441720c52a443d292d5adc2d95f446494Ihab Awad 591aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // A simple outgoing call, verifying that the appropriate connection service is contacted, 592aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad // the proper lifecycle is followed, and both In-Call Services are updated correctly. 593b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startAndMakeActiveOutgoingCall( 5941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad String number, 5951b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad PhoneAccountHandle phoneAccountHandle, 596b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn ConnectionServiceFixture connectionServiceFixture, int videoState) throws Exception { 597578a4e6661fc1be20d164458acb335356d742f72Tony Mak IdPair ids = startOutgoingPhoneCall(number, phoneAccountHandle, connectionServiceFixture, 598b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn Process.myUserHandle(), videoState); 599aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 6001b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendSetDialing(ids.mConnectionId); 6011b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_DIALING, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 6021b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_DIALING, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 603aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 604b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn connectionServiceFixture.sendSetVideoState(ids.mConnectionId); 605b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn 6061b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendSetActive(ids.mConnectionId); 6071b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 6081b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 609aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 6101b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad return ids; 6111b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 6120a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad 613b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startAndMakeActiveIncomingCall( 614b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn String number, 615b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn PhoneAccountHandle phoneAccountHandle, 616b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn ConnectionServiceFixture connectionServiceFixture) throws Exception { 617b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn return startAndMakeActiveIncomingCall(number, phoneAccountHandle, connectionServiceFixture, 618b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn VideoProfile.STATE_AUDIO_ONLY); 61942ef808c284791f21be8675174acc7297418fa45Tyler Gunn } 62042ef808c284791f21be8675174acc7297418fa45Tyler Gunn 6211b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad // A simple incoming call, similar in scope to the previous test 622b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn protected IdPair startAndMakeActiveIncomingCall( 6231b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad String number, 6241b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad PhoneAccountHandle phoneAccountHandle, 625b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn ConnectionServiceFixture connectionServiceFixture, 626b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn int videoState) throws Exception { 6271b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad IdPair ids = startIncomingPhoneCall(number, phoneAccountHandle, connectionServiceFixture); 628aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 6291b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_RINGING, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 6301b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_RINGING, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 631aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 63232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad mInCallServiceFixtureX.mInCallAdapter 633b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .answerCall(ids.mCallId, videoState); 634b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn 635b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn if (!VideoProfile.isVideo(videoState)) { 636b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(connectionServiceFixture.getTestDouble()) 637b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .answer(ids.mConnectionId); 638b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn } else { 639b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn verify(connectionServiceFixture.getTestDouble()) 640b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn .answerVideo(ids.mConnectionId, videoState); 641b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn } 64232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad 6431b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad connectionServiceFixture.sendSetActive(ids.mConnectionId); 6441b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureX.getCall(ids.mCallId).getState()); 6451b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad assertEquals(Call.STATE_ACTIVE, mInCallServiceFixtureY.getCall(ids.mCallId).getState()); 646aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 6471b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad return ids; 6481b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 649aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad 65032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad protected static void assertTrueWithTimeout(Predicate<Void> predicate) { 65132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad int elapsed = 0; 65232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad while (elapsed < TEST_TIMEOUT) { 65332dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad if (predicate.apply(null)) { 65432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad return; 65532dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } else { 65632dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad try { 65732dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad Thread.sleep(TEST_POLL_INTERVAL); 65832dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad elapsed += TEST_POLL_INTERVAL; 65932dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } catch (InterruptedException e) { 66032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad fail(e.toString()); 66132dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 66232dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad } 6631b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 66432dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad fail("Timeout in assertTrueWithTimeout"); 6651b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad } 666aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad} 667