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