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
17aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadpackage com.android.server.telecom.tests;
18aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
19aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport com.android.internal.telecom.IConnectionService;
20aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport com.android.internal.telecom.IConnectionServiceAdapter;
21aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport com.android.internal.telecom.IVideoProvider;
22aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport com.android.internal.telecom.RemoteServiceCallback;
23aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
24aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport junit.framework.TestCase;
25aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
26aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport org.mockito.Mockito;
27aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
28aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.content.ComponentName;
2974bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liuimport android.content.Context;
30b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastryimport android.net.Uri;
31b3907b3e79864a3a42d5e7105e5051f7e364fdbaSantos Cordonimport android.os.Bundle;
32aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.os.IBinder;
331b5490ac8643a5969adaba6f68d872acd251d666Ihab Awadimport android.os.IInterface;
34aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liuimport android.os.ParcelFileDescriptor;
35aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.os.RemoteException;
361b5490ac8643a5969adaba6f68d872acd251d666Ihab Awadimport android.telecom.CallAudioState;
37f7783fb45c262a36d813cb450062d0076490a530Hall Liuimport android.telecom.Conference;
38aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.telecom.Connection;
39aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.telecom.ConnectionRequest;
40f7783fb45c262a36d813cb450062d0076490a530Hall Liuimport android.telecom.ConnectionService;
41aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.telecom.DisconnectCause;
42953e1af643b66df6f931d76c23bcc54147668cd4Brad Ebingerimport android.telecom.Log;
43b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebingerimport android.telecom.Logging.Session;
44aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.telecom.ParcelableConference;
45aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.telecom.ParcelableConnection;
46aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.telecom.PhoneAccountHandle;
47aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.telecom.StatusHints;
48b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastryimport android.telecom.TelecomManager;
49aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
50c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastryimport com.google.android.collect.Lists;
51c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry
526d96252436c34cbc2407767f67f2f397f390ad95Bryce Leeimport java.lang.Override;
53aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport java.util.ArrayList;
54aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport java.util.HashMap;
55aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport java.util.HashSet;
56aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport java.util.List;
57aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport java.util.Map;
58aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport java.util.Set;
59961694a9750626c067be960170bc95f10b5efcc2Tyler Gunnimport java.util.concurrent.CountDownLatch;
60961694a9750626c067be960170bc95f10b5efcc2Tyler Gunnimport java.util.concurrent.TimeUnit;
61aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
62aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad/**
63aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * Controls a test {@link IConnectionService} as would be provided by a source of connectivity
64aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad * to the Telecom framework.
65aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad */
66aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadpublic class ConnectionServiceFixture implements TestFixture<IConnectionService> {
67b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry    static int INVALID_VIDEO_STATE = -1;
68961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn    public CountDownLatch mExtrasLock = new CountDownLatch(1);
69571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn    static int NOT_SPECIFIED = 0;
70aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
71f7783fb45c262a36d813cb450062d0076490a530Hall Liu    /**
72f7783fb45c262a36d813cb450062d0076490a530Hall Liu     * Implementation of ConnectionService that performs no-ops for tasks normally meant for
73f7783fb45c262a36d813cb450062d0076490a530Hall Liu     * Telephony and reports success back to Telecom
74f7783fb45c262a36d813cb450062d0076490a530Hall Liu     */
75f7783fb45c262a36d813cb450062d0076490a530Hall Liu    public class FakeConnectionServiceDelegate extends ConnectionService {
76b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry        int mVideoState = INVALID_VIDEO_STATE;
77571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn        int mCapabilities = NOT_SPECIFIED;
78571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn        int mProperties = NOT_SPECIFIED;
79b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry
8074bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu        public FakeConnectionServiceDelegate(Context base) {
8174bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu            attachBaseContext(base);
8274bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu        }
8374bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu
84f7783fb45c262a36d813cb450062d0076490a530Hall Liu        @Override
85f7783fb45c262a36d813cb450062d0076490a530Hall Liu        public Connection onCreateUnknownConnection(
86f7783fb45c262a36d813cb450062d0076490a530Hall Liu                PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
87961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn            mLatestConnection = new FakeConnection(request.getVideoState(), request.getAddress());
88961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn            return mLatestConnection;
89f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
90f7783fb45c262a36d813cb450062d0076490a530Hall Liu
91f7783fb45c262a36d813cb450062d0076490a530Hall Liu        @Override
92f7783fb45c262a36d813cb450062d0076490a530Hall Liu        public Connection onCreateIncomingConnection(
93f7783fb45c262a36d813cb450062d0076490a530Hall Liu                PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
94d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn            FakeConnection fakeConnection =  new FakeConnection(
95b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry                    mVideoState == INVALID_VIDEO_STATE ? request.getVideoState() : mVideoState,
96b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry                    request.getAddress());
97961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn            mLatestConnection = fakeConnection;
98571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            if (mCapabilities != NOT_SPECIFIED) {
99d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn                fakeConnection.setConnectionCapabilities(mCapabilities);
100d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn            }
101571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            if (mProperties != NOT_SPECIFIED) {
102571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn                fakeConnection.setConnectionProperties(mProperties);
103571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            }
104d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn
105d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn            return fakeConnection;
106f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
107f7783fb45c262a36d813cb450062d0076490a530Hall Liu
108f7783fb45c262a36d813cb450062d0076490a530Hall Liu        @Override
109f7783fb45c262a36d813cb450062d0076490a530Hall Liu        public Connection onCreateOutgoingConnection(
110f7783fb45c262a36d813cb450062d0076490a530Hall Liu                PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
11184771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger            FakeConnection fakeConnection = new FakeConnection(request.getVideoState(),
11284771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger                    request.getAddress());
11384771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger            mLatestConnection = fakeConnection;
11484771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger            if (mCapabilities != NOT_SPECIFIED) {
11584771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger                fakeConnection.setConnectionCapabilities(mCapabilities);
11684771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger            }
11784771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger            if (mProperties != NOT_SPECIFIED) {
11884771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger                fakeConnection.setConnectionProperties(mProperties);
11984771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger            }
12084771f8f87f5f582bf848b621eed8c6cd99d41b0Brad Ebinger            return fakeConnection;
121f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
122f7783fb45c262a36d813cb450062d0076490a530Hall Liu
123f7783fb45c262a36d813cb450062d0076490a530Hall Liu        @Override
124ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn        public void onCreateConnectionComplete(Connection connection) {
125ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn        }
126ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn
127ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn        @Override
128f7783fb45c262a36d813cb450062d0076490a530Hall Liu        public void onConference(Connection cxn1, Connection cxn2) {
1290d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger            if (((FakeConnection) cxn1).getIsConferenceCreated()) {
1300d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                // Usually, this is implemented by something in Telephony, which does a bunch of
1310d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                // radio work to conference the two connections together. Here we just short-cut
1320d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                // that and declare them conferenced.
1330d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                Conference fakeConference = new FakeConference();
1340d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                fakeConference.addConnection(cxn1);
1350d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                fakeConference.addConnection(cxn2);
1360d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                mLatestConference = fakeConference;
1370d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                addConference(fakeConference);
1380d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger            } else {
1390d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                try {
1400d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                    sendSetConferenceMergeFailed(cxn1.getTelecomCallId());
1410d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                } catch (Exception e) {
1420d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                    Log.w(this, "Exception on sendSetConferenceMergeFailed: " + e.getMessage());
1430d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger                }
1440d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger            }
145f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
146f7783fb45c262a36d813cb450062d0076490a530Hall Liu    }
147f7783fb45c262a36d813cb450062d0076490a530Hall Liu
148f7783fb45c262a36d813cb450062d0076490a530Hall Liu    public class FakeConnection extends Connection {
1490d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        // Set to false if you wish the Conference merge to fail.
1500d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        boolean mIsConferenceCreated = true;
1510d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger
152b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry        public FakeConnection(int videoState, Uri address) {
153f7783fb45c262a36d813cb450062d0076490a530Hall Liu            super();
154f7783fb45c262a36d813cb450062d0076490a530Hall Liu            int capabilities = getConnectionCapabilities();
155f7783fb45c262a36d813cb450062d0076490a530Hall Liu            capabilities |= CAPABILITY_MUTE;
156f7783fb45c262a36d813cb450062d0076490a530Hall Liu            capabilities |= CAPABILITY_SUPPORT_HOLD;
157f7783fb45c262a36d813cb450062d0076490a530Hall Liu            capabilities |= CAPABILITY_HOLD;
158b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn            setVideoState(videoState);
159f7783fb45c262a36d813cb450062d0076490a530Hall Liu            setConnectionCapabilities(capabilities);
1606e8f3d70ac7397afb4cb5ab276d1cd385c92dd21Brad Ebinger            setDialing();
161b7853c0b716f9cc9ae174d1ca4efaa118ef1740eAbhijith Shastry            setAddress(address, TelecomManager.PRESENTATION_ALLOWED);
162f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
163961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn
164961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        @Override
165961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        public void onExtrasChanged(Bundle extras) {
166961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn            mExtrasLock.countDown();
167961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        }
1680d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger
1690d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        public boolean getIsConferenceCreated() {
1700d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger            return mIsConferenceCreated;
1710d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        }
1720d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger
1730d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        public void setIsConferenceCreated(boolean isConferenceCreated) {
1740d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger            mIsConferenceCreated = isConferenceCreated;
1750d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        }
176f7783fb45c262a36d813cb450062d0076490a530Hall Liu    }
177f7783fb45c262a36d813cb450062d0076490a530Hall Liu
178f7783fb45c262a36d813cb450062d0076490a530Hall Liu    public class FakeConference extends Conference {
179f7783fb45c262a36d813cb450062d0076490a530Hall Liu        public FakeConference() {
180f7783fb45c262a36d813cb450062d0076490a530Hall Liu            super(null);
181f7783fb45c262a36d813cb450062d0076490a530Hall Liu            setConnectionCapabilities(
182f7783fb45c262a36d813cb450062d0076490a530Hall Liu                    Connection.CAPABILITY_SUPPORT_HOLD
183f7783fb45c262a36d813cb450062d0076490a530Hall Liu                            | Connection.CAPABILITY_HOLD
184f7783fb45c262a36d813cb450062d0076490a530Hall Liu                            | Connection.CAPABILITY_MUTE
185f7783fb45c262a36d813cb450062d0076490a530Hall Liu                            | Connection.CAPABILITY_MANAGE_CONFERENCE);
186f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
187f7783fb45c262a36d813cb450062d0076490a530Hall Liu
188f7783fb45c262a36d813cb450062d0076490a530Hall Liu        @Override
189f7783fb45c262a36d813cb450062d0076490a530Hall Liu        public void onMerge(Connection connection) {
190f7783fb45c262a36d813cb450062d0076490a530Hall Liu            // Do nothing besides inform the connection that it was merged into this conference.
191f7783fb45c262a36d813cb450062d0076490a530Hall Liu            connection.setConference(this);
192f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
193961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn
194961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        @Override
195961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        public void onExtrasChanged(Bundle extras) {
196961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn            Log.w(this, "FakeConference onExtrasChanged");
197961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn            mExtrasLock.countDown();
198961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        }
199f7783fb45c262a36d813cb450062d0076490a530Hall Liu    }
200f7783fb45c262a36d813cb450062d0076490a530Hall Liu
2011b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad    public class FakeConnectionService extends IConnectionService.Stub {
202c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry        List<String> rejectedCallIds = Lists.newArrayList();
2031b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2041b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
205b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void addConnectionServiceAdapter(IConnectionServiceAdapter adapter,
206b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException {
2071b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            if (!mConnectionServiceAdapters.add(adapter)) {
2081b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad                throw new RuntimeException("Adapter already added: " + adapter);
2091b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            }
210b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger            mConnectionServiceDelegateAdapter.addConnectionServiceAdapter(adapter,
211b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                    null /*Session.Info*/);
2121b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        }
2131b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2141b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
215b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void removeConnectionServiceAdapter(IConnectionServiceAdapter adapter,
216b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException {
2171b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            if (!mConnectionServiceAdapters.remove(adapter)) {
2181b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad                throw new RuntimeException("Adapter never added: " + adapter);
2191b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            }
220b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger            mConnectionServiceDelegateAdapter.removeConnectionServiceAdapter(adapter,
221b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                    null /*Session.Info*/);
2221b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        }
2231b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2241b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
2251b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        public void createConnection(PhoneAccountHandle connectionManagerPhoneAccount,
226b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                String id, ConnectionRequest request, boolean isIncoming, boolean isUnknown,
227b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException {
228a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn            Log.i(ConnectionServiceFixture.this, "createConnection --> " + id);
2291b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2301b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            if (mConnectionById.containsKey(id)) {
2311b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad                throw new RuntimeException("Connection already exists: " + id);
2321b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            }
2331b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            mLatestConnectionId = id;
2341b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            ConnectionInfo c = new ConnectionInfo();
2351b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            c.connectionManagerPhoneAccount = connectionManagerPhoneAccount;
2361b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            c.id = id;
2371b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            c.request = request;
2381b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            c.isIncoming = isIncoming;
2391b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            c.isUnknown = isUnknown;
24032dd7c331c5b4dc475d96b113a052286973f78fcIhab Awad            c.capabilities |= Connection.CAPABILITY_HOLD | Connection.CAPABILITY_SUPPORT_HOLD;
241b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn            c.videoState = request.getVideoState();
242b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn            c.mockVideoProvider = new MockVideoProvider();
243b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn            c.videoProvider = c.mockVideoProvider.getInterface();
2440d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger            c.isConferenceCreated = true;
2451b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            mConnectionById.put(id, c);
246f7783fb45c262a36d813cb450062d0076490a530Hall Liu            mConnectionServiceDelegateAdapter.createConnection(connectionManagerPhoneAccount,
247b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                    id, request, isIncoming, isUnknown, null /*Session.Info*/);
2481b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        }
2491b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2501b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
251ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn        public void createConnectionComplete(String id, Session.Info info) throws RemoteException {
252ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn            mConnectionServiceDelegateAdapter.createConnectionComplete(id, null /*Session.Info*/);
253ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn        }
254ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn
255ddb03e1387a09f9c7da624b064bf4f5b90ed478cTyler Gunn        @Override
256115c06ee64e209cda99abdc1fbd23fd65aa6da47Tyler Gunn        public void createConnectionFailed(PhoneAccountHandle connectionManagerPhoneAccount,
257115c06ee64e209cda99abdc1fbd23fd65aa6da47Tyler Gunn                String callId, ConnectionRequest request, boolean isIncoming,
258115c06ee64e209cda99abdc1fbd23fd65aa6da47Tyler Gunn                Session.Info sessionInfo) throws RemoteException {
259a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn            Log.i(ConnectionServiceFixture.this, "createConnectionFailed --> " + callId);
260a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn
261a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn            if (mConnectionById.containsKey(callId)) {
262a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn                throw new RuntimeException("Connection already exists: " + callId);
263a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn            }
264a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn
265a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn            // TODO(3p-calls): Implement this.
266a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn        }
267a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn
268a90ba73e6ca2e7e3ef88e41477bf595e03f9359fTyler Gunn        @Override
269b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void abort(String callId, Session.Info info) throws RemoteException { }
2701b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2711b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
272b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void answerVideo(String callId, int videoState,
273b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException { }
2741b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2751b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
276b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void answer(String callId, Session.Info info) throws RemoteException { }
2771b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2781b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
279ad4ebc022bf8a28958606121a1a2a0c4130dc821Pooja Jain        public void deflect(String callId, Uri address, Session.Info info)
280ad4ebc022bf8a28958606121a1a2a0c4130dc821Pooja Jain                throws RemoteException { }
281ad4ebc022bf8a28958606121a1a2a0c4130dc821Pooja Jain
282ad4ebc022bf8a28958606121a1a2a0c4130dc821Pooja Jain        @Override
283b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void reject(String callId, Session.Info info) throws RemoteException {
284c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry            rejectedCallIds.add(callId);
285c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry        }
2861b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2871b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
288b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void rejectWithMessage(String callId, String message,
289b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException { }
290ddd966e7f6b947e345163c442f4c2f9c3d146024Bryce Lee
291ddd966e7f6b947e345163c442f4c2f9c3d146024Bryce Lee        @Override
292b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void disconnect(String callId, Session.Info info) throws RemoteException { }
2931b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
2941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
295b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void silence(String callId, Session.Info info) throws RemoteException { }
2966d96252436c34cbc2407767f67f2f397f390ad95Bryce Lee
2976d96252436c34cbc2407767f67f2f397f390ad95Bryce Lee        @Override
298b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void hold(String callId, Session.Info info) throws RemoteException { }
2991b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3001b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
301b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void unhold(String callId, Session.Info info) throws RemoteException { }
3021b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3031b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
304b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void onCallAudioStateChanged(String activeCallId, CallAudioState audioState,
305b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info)
3061b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad                throws RemoteException { }
3071b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3081b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
309b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void playDtmfTone(String callId, char digit,
310b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException { }
3111b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3121b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
313b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void stopDtmfTone(String callId, Session.Info info) throws RemoteException { }
3141b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3151b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
316b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void conference(String conferenceCallId, String callId,
317b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException {
318b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger            mConnectionServiceDelegateAdapter.conference(conferenceCallId, callId, info);
319f7783fb45c262a36d813cb450062d0076490a530Hall Liu        }
3201b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3211b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
322b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void splitFromConference(String callId, Session.Info info) throws RemoteException { }
3231b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3241b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
325b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void mergeConference(String conferenceCallId,
326b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException { }
3271b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3281b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
329b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void swapConference(String conferenceCallId,
330b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException { }
3311b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3321b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
333b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void onPostDialContinue(String callId, boolean proceed,
334b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException { }
3351b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3361b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
337b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void pullExternalCall(String callId, Session.Info info) throws RemoteException { }
338d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn
339d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn        @Override
340b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void sendCallEvent(String callId, String event, Bundle extras,
341b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException
342d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn        {}
343d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn
344b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger        public void onExtrasChanged(String callId, Bundle extras,
345b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger                Session.Info info) throws RemoteException {
346b78b0234c6e9a937fc00fec6d16e534535b6fab9Brad Ebinger            mConnectionServiceDelegateAdapter.onExtrasChanged(callId, extras, info);
347961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        }
348961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn
349d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn        @Override
350aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        public void startRtt(String callId, ParcelFileDescriptor fromInCall,
351aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu                ParcelFileDescriptor toInCall, Session.Info sessionInfo) throws RemoteException {
352aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
353aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        }
354aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
355aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        @Override
356aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        public void stopRtt(String callId, Session.Info sessionInfo) throws RemoteException {
357aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
358aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        }
359aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
360aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        @Override
361aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        public void respondToRttUpgradeRequest(String callId, ParcelFileDescriptor fromInCall,
362aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu                ParcelFileDescriptor toInCall, Session.Info sessionInfo) throws RemoteException {
363aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
364aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        }
365aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
366aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        @Override
3671952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng        public void connectionServiceFocusLost(Session.Info sessionInfo) throws RemoteException {
3681952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng        }
3691952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng
3701952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng        @Override
3711952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng        public void connectionServiceFocusGained(Session.Info sessionInfo) throws RemoteException {
3721952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng        }
3731952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng
3741952a36d0f29ec9e880d5228ba40a52def1af437Pengquan Meng        @Override
3751b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        public IBinder asBinder() {
3761b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            return this;
3771b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        }
3781b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
3791b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        @Override
3801b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        public IInterface queryLocalInterface(String descriptor) {
3811b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad            return this;
3821b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        }
38329411c95d0a0fe3fe84a460934fe89078327311eSanket Padawe
38429411c95d0a0fe3fe84a460934fe89078327311eSanket Padawe        @Override
38529411c95d0a0fe3fe84a460934fe89078327311eSanket Padawe        public void handoverFailed(String callId, ConnectionRequest request,
38629411c95d0a0fe3fe84a460934fe89078327311eSanket Padawe                                   int error, Session.Info sessionInfo) {}
3877c031f2244d820ead60523cf515f6610bf215873Tyler Gunn
3887c031f2244d820ead60523cf515f6610bf215873Tyler Gunn        @Override
3897c031f2244d820ead60523cf515f6610bf215873Tyler Gunn        public void handoverComplete(String callId, Session.Info sessionInfo) {}
390f7783fb45c262a36d813cb450062d0076490a530Hall Liu    }
391f7783fb45c262a36d813cb450062d0076490a530Hall Liu
39274bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu    FakeConnectionServiceDelegate mConnectionServiceDelegate;
39374bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu    private IConnectionService mConnectionServiceDelegateAdapter;
3941b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad
395c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry    FakeConnectionService mConnectionService = new FakeConnectionService();
3961b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad    private IConnectionService.Stub mConnectionServiceSpy = Mockito.spy(mConnectionService);
397aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
398aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public class ConnectionInfo {
399aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        PhoneAccountHandle connectionManagerPhoneAccount;
400aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        String id;
401aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        boolean ringing;
402aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        ConnectionRequest request;
403aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        boolean isIncoming;
404aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        boolean isUnknown;
405aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        int state;
406aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        int addressPresentation;
407aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        int capabilities;
408571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn        int properties;
40996a0be67619944378d95cdedc64b004aadb341e2Christine Hallstrom        int supportedAudioRoutes;
410aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        StatusHints statusHints;
411aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        DisconnectCause disconnectCause;
412aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        String conferenceId;
413aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        String callerDisplayName;
414aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        int callerDisplayNamePresentation;
415aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        final List<String> conferenceableConnectionIds = new ArrayList<>();
416aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        IVideoProvider videoProvider;
417b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn        Connection.VideoProvider videoProviderImpl;
418b492f4c845e61fac17c0e523363607d2dd6ba987Tyler Gunn        MockVideoProvider mockVideoProvider;
419aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        int videoState;
420aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        boolean isVoipAudioMode;
421b3907b3e79864a3a42d5e7105e5051f7e364fdbaSantos Cordon        Bundle extras;
4220d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        boolean isConferenceCreated;
423aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
424aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
425aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public class ConferenceInfo {
426aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        PhoneAccountHandle phoneAccount;
427aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        int state;
428aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        int capabilities;
429571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn        int properties;
430aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        final List<String> connectionIds = new ArrayList<>();
431d240fe8e16205623eb6cb73c3d42448554690033Rekha Kumar        IVideoProvider videoProvider;
432d240fe8e16205623eb6cb73c3d42448554690033Rekha Kumar        int videoState;
433aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        long connectTimeMillis;
4348bb2b019123e50a21709eae20edc9db043326053Tyler Gunn        long connectElapsedTimeMillis;
435569b54e5dff12cc29aa253efb3c61bc4fc5d778eAndrew Lee        StatusHints statusHints;
436b3907b3e79864a3a42d5e7105e5051f7e364fdbaSantos Cordon        Bundle extras;
437aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
438aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
439aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public String mLatestConnectionId;
440961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn    public Connection mLatestConnection;
441961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn    public Conference mLatestConference;
442aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public final Set<IConnectionServiceAdapter> mConnectionServiceAdapters = new HashSet<>();
443aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public final Map<String, ConnectionInfo> mConnectionById = new HashMap<>();
444aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public final Map<String, ConferenceInfo> mConferenceById = new HashMap<>();
445aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public final List<ComponentName> mRemoteConnectionServiceNames = new ArrayList<>();
446aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public final List<IBinder> mRemoteConnectionServices = new ArrayList<>();
447aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
44874bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu    public ConnectionServiceFixture(Context context) throws Exception {
44974bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu        mConnectionServiceDelegate = new FakeConnectionServiceDelegate(context);
45074bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu        mConnectionServiceDelegateAdapter = IConnectionService.Stub.asInterface(
45174bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu                mConnectionServiceDelegate.onBind(null));
45274bb635206f94e6846810d9dcbd41d56c07f24f7Hall Liu    }
453aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
454aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    @Override
455aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public IConnectionService getTestDouble() {
4561b5490ac8643a5969adaba6f68d872acd251d666Ihab Awad        return mConnectionServiceSpy;
457aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
458aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
459aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendHandleCreateConnectionComplete(String id) throws Exception {
460aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
461aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            a.handleCreateConnectionComplete(
462aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    id,
463aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    mConnectionById.get(id).request,
46465912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger                    parcelable(mConnectionById.get(id)), null /*Session.Info*/);
465aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
466aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
467aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
468aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetActive(String id) throws Exception {
469aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        mConnectionById.get(id).state = Connection.STATE_ACTIVE;
470aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
47165912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setActive(id, null /*Session.Info*/);
472aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
473aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
474aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
475aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetRinging(String id) throws Exception {
476aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        mConnectionById.get(id).state = Connection.STATE_RINGING;
477aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
47865912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setRinging(id, null /*Session.Info*/);
479aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
480aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
481aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
482aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetDialing(String id) throws Exception {
483aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        mConnectionById.get(id).state = Connection.STATE_DIALING;
484aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
48565912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setDialing(id, null /*Session.Info*/);
486aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
487aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
488aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
489aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetDisconnected(String id, int disconnectCause) throws Exception {
490aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        mConnectionById.get(id).state = Connection.STATE_DISCONNECTED;
491aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        mConnectionById.get(id).disconnectCause = new DisconnectCause(disconnectCause);
492aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
49365912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setDisconnected(id, mConnectionById.get(id).disconnectCause, null /*Session.Info*/);
494aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
495aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
496aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
497aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetOnHold(String id) throws Exception {
498aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        mConnectionById.get(id).state = Connection.STATE_HOLDING;
499aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
50065912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setOnHold(id, null /*Session.Info*/);
501aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
502aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
503aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
504aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetRingbackRequested(String id) throws Exception {
505aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
50665912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setRingbackRequested(id, mConnectionById.get(id).ringing, null /*Session.Info*/);
507aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
508aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
509aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
510aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetConnectionCapabilities(String id) throws Exception {
511aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
51265912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setConnectionCapabilities(id, mConnectionById.get(id).capabilities,
51365912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger                    null /*Session.Info*/);
514aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
515aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
516aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
517d7fe686253f2135a948cafc776aa25db645ec27eHall Liu    public void sendSetConnectionProperties(String id) throws Exception {
518d7fe686253f2135a948cafc776aa25db645ec27eHall Liu        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
51965912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setConnectionProperties(id, mConnectionById.get(id).properties, null /*Session.Info*/);
520d7fe686253f2135a948cafc776aa25db645ec27eHall Liu        }
521d7fe686253f2135a948cafc776aa25db645ec27eHall Liu    }
522aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetIsConferenced(String id) throws Exception {
523aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
52465912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setIsConferenced(id, mConnectionById.get(id).conferenceId, null /*Session.Info*/);
525aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
526aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
527aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
528aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendAddConferenceCall(String id) throws Exception {
529aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
53065912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.addConferenceCall(id, parcelable(mConferenceById.get(id)), null /*Session.Info*/);
531aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
532aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
533aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
534aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendRemoveCall(String id) throws Exception {
535aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
53665912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.removeCall(id, null /*Session.Info*/);
537aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
538aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
539aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
540aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendOnPostDialWait(String id, String remaining) throws Exception {
541aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
54265912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.onPostDialWait(id, remaining, null /*Session.Info*/);
543aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
544aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
545aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
546aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendOnPostDialChar(String id, char nextChar) throws Exception {
547aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
54865912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.onPostDialChar(id, nextChar, null /*Session.Info*/);
549aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
550aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
551aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
552aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendQueryRemoteConnectionServices() throws Exception {
553aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        mRemoteConnectionServices.clear();
554aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
555aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            a.queryRemoteConnectionServices(new RemoteServiceCallback.Stub() {
556aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                @Override
557aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                public void onError() throws RemoteException {
558aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    throw new RuntimeException();
559aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                }
560aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
561aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                @Override
562aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                public void onResult(
563aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                        List<ComponentName> names,
564aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                        List<IBinder> services)
565aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                        throws RemoteException {
566aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    TestCase.assertEquals(names.size(), services.size());
567aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    mRemoteConnectionServiceNames.addAll(names);
568aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    mRemoteConnectionServices.addAll(services);
569aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                }
570aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
571aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                @Override
572aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                public IBinder asBinder() {
573aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return this;
574aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                }
57565912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            }, null /*Session.Info*/);
576aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
577aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
578aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
579aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetVideoProvider(String id) throws Exception {
580aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
58165912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setVideoProvider(id, mConnectionById.get(id).videoProvider, null /*Session.Info*/);
582aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
583aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
584aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
585aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetVideoState(String id) throws Exception {
586aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
58765912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setVideoState(id, mConnectionById.get(id).videoState, null /*Session.Info*/);
588aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
589aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
590aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
591aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetIsVoipAudioMode(String id) throws Exception {
592aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
59365912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setIsVoipAudioMode(id, mConnectionById.get(id).isVoipAudioMode,
59465912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger                    null /*Session.Info*/);
595aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
596aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
597aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
598aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetStatusHints(String id) throws Exception {
599aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
60065912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setStatusHints(id, mConnectionById.get(id).statusHints, null /*Session.Info*/);
601aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
602aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
603aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
604aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetAddress(String id) throws Exception {
605aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
606aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            a.setAddress(
607aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    id,
608aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    mConnectionById.get(id).request.getAddress(),
60965912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger                    mConnectionById.get(id).addressPresentation, null /*Session.Info*/);
610aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
611aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
612aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
613aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetCallerDisplayName(String id) throws Exception {
614aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
615aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            a.setCallerDisplayName(
616aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    id,
617aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    mConnectionById.get(id).callerDisplayName,
61865912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger                    mConnectionById.get(id).callerDisplayNamePresentation, null /*Session.Info*/);
619aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
620aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
621aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
622aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendSetConferenceableConnections(String id) throws Exception {
623aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
62465912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setConferenceableConnections(id, mConnectionById.get(id).conferenceableConnectionIds,
62565912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger                    null /*Session.Info*/);
626aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
627aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
628aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
629aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public void sendAddExistingConnection(String id) throws Exception {
630aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
63165912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.addExistingConnection(id, parcelable(mConnectionById.get(id)), null /*Session.Info*/);
632aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
633aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
634aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
635d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn    public void sendConnectionEvent(String id, String event, Bundle extras) throws Exception {
636d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
63765912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.onConnectionEvent(id, event, extras, null /*Session.Info*/);
638d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn        }
639d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn    }
640d45e6d973ea7460fb605a1eb7a66ba38c6f2467dTyler Gunn
6410d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger    public void sendSetConferenceMergeFailed(String id) throws Exception {
6420d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
64365912759cdf64aa5a38f5498f22c8b5ba8a97ebeBrad Ebinger            a.setConferenceMergeFailed(id, null /*Session.Info*/);
6440d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger        }
6450d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger    }
6460d40255032680d3cce56a07f7eba8baefc5512cdBrad Ebinger
647961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn    /**
648961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn     * Waits until the {@link Connection#onExtrasChanged(Bundle)} API has been called on a
649961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn     * {@link Connection} or {@link Conference}.
650961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn     */
651961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn    public void waitForExtras() {
652961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        try {
653961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn            mExtrasLock.await(TelecomSystemTest.TEST_TIMEOUT, TimeUnit.MILLISECONDS);
654961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        } catch (InterruptedException ie) {
655961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        }
656961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn        mExtrasLock = new CountDownLatch(1);
657961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn    }
658961694a9750626c067be960170bc95f10b5efcc2Tyler Gunn
659aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private ParcelableConference parcelable(ConferenceInfo c) {
660aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        return new ParcelableConference(
661aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.phoneAccount,
662aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.state,
663aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.capabilities,
664571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn                c.properties,
665aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.connectionIds,
666d240fe8e16205623eb6cb73c3d42448554690033Rekha Kumar                c.videoProvider,
667d240fe8e16205623eb6cb73c3d42448554690033Rekha Kumar                c.videoState,
668569b54e5dff12cc29aa253efb3c61bc4fc5d778eAndrew Lee                c.connectTimeMillis,
6698bb2b019123e50a21709eae20edc9db043326053Tyler Gunn                c.connectElapsedTimeMillis,
670b3907b3e79864a3a42d5e7105e5051f7e364fdbaSantos Cordon                c.statusHints,
671b3907b3e79864a3a42d5e7105e5051f7e364fdbaSantos Cordon                c.extras);
672aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
673aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
674aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private ParcelableConnection parcelable(ConnectionInfo c) {
675aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        return new ParcelableConnection(
676aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.request.getAccountHandle(),
677aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.state,
678aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.capabilities,
679571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn                c.properties,
68096a0be67619944378d95cdedc64b004aadb341e2Christine Hallstrom                c.supportedAudioRoutes,
681aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.request.getAddress(),
682aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.addressPresentation,
683aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.callerDisplayName,
684aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.callerDisplayNamePresentation,
685aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.videoProvider,
686aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.videoState,
687aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                false, /* ringback requested */
688aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                false, /* voip audio mode */
689084ab0835ea9879185d3e6aa7f9be48ae4067bedRoshan Pius                0, /* Connect Time for conf call on this connection */
6908bb2b019123e50a21709eae20edc9db043326053Tyler Gunn                0, /* Connect Real Time comes from conference call */
691aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.statusHints,
692aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                c.disconnectCause,
693b3907b3e79864a3a42d5e7105e5051f7e364fdbaSantos Cordon                c.conferenceableConnectionIds,
694b3907b3e79864a3a42d5e7105e5051f7e364fdbaSantos Cordon                c.extras);
695aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    }
696aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad}
697