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