1c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad/*
2c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * Copyright (C) 2013 The Android Open Source Project
3c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad *
4c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * Licensed under the Apache License, Version 2.0 (the "License");
5c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * you may not use this file except in compliance with the License.
6c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * You may obtain a copy of the License at
7c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad *
8c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad *      http://www.apache.org/licenses/LICENSE-2.0
9c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad *
10c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * Unless required by applicable law or agreed to in writing, software
11c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * distributed under the License is distributed on an "AS IS" BASIS,
12c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * See the License for the specific language governing permissions and
14c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * limitations under the License.
15c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad */
16c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
177cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnpackage com.android.server.telecom.testapps;
18c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
19c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awadimport android.net.Uri;
202a66f7b906b225413ae33f72e70a75e4f9c883c0Yorke Leeimport android.telecom.CallAudioState;
217cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.Conference;
227cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.Connection;
237cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.ConnectionRequest;
247cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.ConnectionService;
25701dc006ac11625b55d872f1639107b028933895Andrew Leeimport android.telecom.DisconnectCause;
267cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.PhoneAccountHandle;
277cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.RemoteConference;
287cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.RemoteConnection;
297cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.StatusHints;
307cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnimport android.telecom.VideoProfile;
31c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awadimport android.util.Log;
32c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
338000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awadimport java.util.ArrayList;
348000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awadimport java.util.HashMap;
358000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awadimport java.util.List;
368000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awadimport java.util.Map;
37c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
38c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad/**
39c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * Service which acts as a fake ConnectionManager if so configured.
40c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad * TODO(santoscordon): Rename all classes in the directory to Dummy* (e.g., DummyConnectionService).
41c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad */
42c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awadpublic class TestConnectionManager extends ConnectionService {
438000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    public final class TestManagedConnection extends Connection {
445be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee        private final RemoteConnection.Callback mRemoteCallback = new RemoteConnection.Callback() {
45c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
46c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            public void onStateChanged(RemoteConnection connection, int state) {
47c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                setState(state);
48c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
49c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
50c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
51701dc006ac11625b55d872f1639107b028933895Andrew Lee            public void onDisconnected(
52701dc006ac11625b55d872f1639107b028933895Andrew Lee                    RemoteConnection connection, DisconnectCause disconnectCause) {
53701dc006ac11625b55d872f1639107b028933895Andrew Lee                setDisconnected(disconnectCause);
54c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                destroy();
55c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
56c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
57c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
585be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee            public void onRingbackRequested(RemoteConnection connection, boolean ringback) {
595be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee                setRingbackRequested(ringback);
60c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
61c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
62c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
6307bc5ee853bc9a0b4cd46e0c702888b2c7989392Ihab Awad            public void onConnectionCapabilitiesChanged(RemoteConnection connection,
6407bc5ee853bc9a0b4cd46e0c702888b2c7989392Ihab Awad                    int connectionCapabilities) {
6507bc5ee853bc9a0b4cd46e0c702888b2c7989392Ihab Awad                setConnectionCapabilities(connectionCapabilities);
66c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
67c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
68c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
69571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            public void onConnectionPropertiesChanged(RemoteConnection connection,
70571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn                    int connectionProperties) {
71571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn                setConnectionProperties(connectionProperties);
72571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            }
73571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn
74571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            @Override
75c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            public void onPostDialWait(RemoteConnection connection, String remainingDigits) {
76c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                setPostDialWait(remainingDigits);
77c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
78c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
79c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
805be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee            public void onVoipAudioChanged(RemoteConnection connection, boolean isVoip) {
81c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                setAudioModeIsVoip(isVoip);
82c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
83c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
84c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
85c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            public void onStatusHintsChanged(RemoteConnection connection, StatusHints statusHints) {
86c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                setStatusHints(statusHints);
87c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
88c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
89c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
90c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            public void onVideoStateChanged(RemoteConnection connection, int videoState) {
915b8824979e929250a46791c785b8459512236585Tyler Gunn                if (videoState == VideoProfile.STATE_BIDIRECTIONAL) {
92a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad                    setVideoProvider(new TestManagedVideoProvider(connection.getVideoProvider()));
93a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad                }
94c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                setVideoState(videoState);
95c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
96c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
97c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
985be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee            public void onAddressChanged(
995be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee                    RemoteConnection connection, Uri address, int presentation) {
1005be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee                setAddress(address, presentation);
101c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
102c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
103c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
104c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            public void onCallerDisplayNameChanged(
105c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    RemoteConnection connection, String callerDisplayName, int presentation) {
106c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                setCallerDisplayName(callerDisplayName, presentation);
107c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
108c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
109c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            @Override
110c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            public void onDestroyed(RemoteConnection connection) {
111c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                destroy();
1128000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                mManagedConnectionByRemote.remove(mRemote);
1138000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
1148000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
1158000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            @Override
1168000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            public void onConferenceableConnectionsChanged(
1178000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    RemoteConnection connect,
1188000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    List<RemoteConnection> conferenceable) {
1198000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                List<Connection> c = new ArrayList<>();
1208000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                for (RemoteConnection remote : conferenceable) {
1218000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    if (mManagedConnectionByRemote.containsKey(remote)) {
1228000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        c.add(mManagedConnectionByRemote.get(remote));
1238000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    }
1248000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                }
1258000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                setConferenceableConnections(c);
126c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
127aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
128aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            @Override
129aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            public void onRttInitiationSuccess(RemoteConnection connection) {
130aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu                sendRttInitiationSuccess();
131aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            }
132aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
133aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            @Override
134aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            public void onRttInitiationFailure(RemoteConnection connection, int reason) {
135aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu                sendRttInitiationFailure(reason);
136aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            }
137aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
138aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            @Override
139aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            public void onRttSessionRemotelyTerminated(RemoteConnection connection) {
140aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu                sendRttSessionRemotelyTerminated();
141aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            }
142aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
143aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            @Override
144aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            public void onRemoteRttRequest(RemoteConnection connection) {
145aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu                sendRemoteRttRequest();
146aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            }
147c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        };
148c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
1498000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        private final RemoteConnection mRemote;
150c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        private final boolean mIsIncoming;
151c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
1528000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        TestManagedConnection(RemoteConnection remote, boolean isIncoming) {
1538000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote = remote;
154c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            mIsIncoming = isIncoming;
1555be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee            mRemote.registerCallback(mRemoteCallback);
1568000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            setState(mRemote.getState());
157a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad            setVideoState(mRemote.getVideoState());
158dd68bc36a3278557b1c4d9183ed9e3dee077eb20Hall Liu            setConnectionProperties(remote.getConnectionProperties());
159c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
160c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
161c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        @Override
162c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        public void onAbort() {
1638000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote.abort();
164c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
165c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
166aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        /**
167aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         * ${inheritDoc}
168aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         */
169c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        @Override
170c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        public void onAnswer(int videoState) {
1718000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote.answer(videoState);
172c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
173c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
174aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        /**
175aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         * ${inheritDoc}
176aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         */
177c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        @Override
178c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        public void onDisconnect() {
1798000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote.disconnect();
180c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
181c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
18239b6a9847b8b39b85145d7abdad6485c8f6f0beaIhab Awad        @Override
18339b6a9847b8b39b85145d7abdad6485c8f6f0beaIhab Awad        public void onPlayDtmfTone(char c) {
1848000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote.playDtmfTone(c);
18539b6a9847b8b39b85145d7abdad6485c8f6f0beaIhab Awad        }
18639b6a9847b8b39b85145d7abdad6485c8f6f0beaIhab Awad
187aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        /**
188aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         * ${inheritDoc}
189aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         */
190c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        @Override
191c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        public void onHold() {
1928000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote.hold();
193c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
194c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
195aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        /**
196aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         * ${inheritDoc}
197aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         */
198c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        @Override
199c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        public void onReject() {
2008000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote.reject();
201c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
202c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
203aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        /**
204aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         * ${inheritDoc}
205aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu         */
206c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        @Override
207c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        public void onUnhold() {
2088000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote.unhold();
209c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
210c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
211c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        @Override
2122a66f7b906b225413ae33f72e70a75e4f9c883c0Yorke Lee        public void onCallAudioStateChanged(CallAudioState state) {
2132a66f7b906b225413ae33f72e70a75e4f9c883c0Yorke Lee            mRemote.setCallAudioState(state);
214c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
215c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
216aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        @Override
217aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        public void onStartRtt(RttTextStream rttTextStream) {
218aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            mRemote.startRtt(rttTextStream);
219aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        }
220aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
221aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        @Override
222aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        public void onStopRtt() {
223aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            mRemote.stopRtt();
224aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        }
225aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
226aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        @Override
227aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        public void handleRttUpgradeResponse(RttTextStream rttTextStream) {
228aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu            mRemote.sendRttUpgradeResponse(rttTextStream);
229aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu        }
230aeece4ec4184b76e0ac2e8a012af05638ad866f6Hall Liu
231c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        private void setState(int state) {
232c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            log("setState: " + state);
233c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            switch (state) {
2346fb37c87836b5245046bd3b14320823ab839a10cIhab Awad                case STATE_ACTIVE:
235c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    setActive();
236c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    break;
2376fb37c87836b5245046bd3b14320823ab839a10cIhab Awad                case STATE_HOLDING:
238c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    setOnHold();
239c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    break;
2406fb37c87836b5245046bd3b14320823ab839a10cIhab Awad                case STATE_DIALING:
241c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    setDialing();
242c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    break;
2436fb37c87836b5245046bd3b14320823ab839a10cIhab Awad                case STATE_RINGING:
244c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    setRinging();
245c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad                    break;
246c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            }
247c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad        }
248c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    }
2498000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    public final class TestManagedConference extends Conference {
250066fc775ad653e0ce94b6253746081f6a5ea5272Nancy Chen        private final RemoteConference.Callback mRemoteCallback = new RemoteConference.Callback() {
2518000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            @Override
2528000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            public void onStateChanged(RemoteConference conference, int oldState, int newState) {
2538000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                switch (newState) {
2548000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    case Connection.STATE_DISCONNECTED:
2558000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        // See onDisconnected below
2568000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        break;
2578000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    case Connection.STATE_HOLDING:
2588000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        setOnHold();
2598000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        break;
2608000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    case Connection.STATE_ACTIVE:
2618000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        setActive();
2628000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        break;
2638000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    default:
2648000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        log("unrecognized state for Conference: " + newState);
2658000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                        break;
2668000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                }
2678000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
2688000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
2698000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            @Override
270701dc006ac11625b55d872f1639107b028933895Andrew Lee            public void onDisconnected(RemoteConference conference,
271701dc006ac11625b55d872f1639107b028933895Andrew Lee                    DisconnectCause disconnectCause) {
272701dc006ac11625b55d872f1639107b028933895Andrew Lee                setDisconnected(disconnectCause);
2738000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
2748000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
2758000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            @Override
2768000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            public void onConnectionAdded(
2778000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    RemoteConference conference,
2788000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    RemoteConnection connection) {
2798000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                TestManagedConnection c = mManagedConnectionByRemote.get(connection);
2808000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                if (c == null) {
2818000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    log("onConnectionAdded cannot find remote connection: " + connection);
2828000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                } else {
2838000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    addConnection(c);
2848000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                }
2858000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
2868000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
2878000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            @Override
2888000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            public void onConnectionRemoved(
2898000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    RemoteConference conference,
2908000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    RemoteConnection connection) {
2918000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                TestManagedConnection c = mManagedConnectionByRemote.get(connection);
2928000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                if (c == null) {
2938000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    log("onConnectionRemoved cannot find remote connection: " + connection);
2948000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                } else {
2958000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    removeConnection(c);
2968000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                }
2978000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
2988000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
2998000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            @Override
30007bc5ee853bc9a0b4cd46e0c702888b2c7989392Ihab Awad            public void onConnectionCapabilitiesChanged(RemoteConference conference,
30107bc5ee853bc9a0b4cd46e0c702888b2c7989392Ihab Awad                    int connectionCapabilities) {
30207bc5ee853bc9a0b4cd46e0c702888b2c7989392Ihab Awad                setConnectionCapabilities(connectionCapabilities);
3038000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
3048000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
3058000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            @Override
306571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            public void onConnectionPropertiesChanged(RemoteConference conference,
307571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn                    int connectionProperties) {
308571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn                setConnectionProperties(connectionProperties);
309571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            }
310571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn
311571d5e66b8cbee023702b4b0a2a1c28663c5a7f8Tyler Gunn            @Override
3128000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            public void onDestroyed(RemoteConference conference) {
3138000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                destroy();
3145be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee                mRemote.unregisterCallback(mRemoteCallback);
3158000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                mManagedConferenceByRemote.remove(mRemote);
3168000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
317c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee
318c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee        };
319c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee
320c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee        @Override
321c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee        public void onPlayDtmfTone(char c) {
322c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee            mRemote.playDtmfTone(c);
323c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee        };
324c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee
325c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee        @Override
326c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee        public void onStopDtmfTone() {
327c43894f93d4481eac726e1a47b3fe1b620f37876Yorke Lee            mRemote.stopDtmfTone();
3288000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        };
3298000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
3308000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        private final RemoteConference mRemote;
3318000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
3328000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        public TestManagedConference(RemoteConference remote) {
3338000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            super(null);
3348000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            mRemote = remote;
3355be64bc46c23b614d5452ca398a6bb7a512f1887Andrew Lee            remote.registerCallback(mRemoteCallback);
3368000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            setActive();
3378000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            for (RemoteConnection r : remote.getConnections()) {
3388000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                TestManagedConnection c = mManagedConnectionByRemote.get(r);
3398000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                if (c != null) {
3408000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                    addConnection(c);
3418000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                }
3428000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            }
3438000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        }
3448000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    }
3458000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
346a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad    static void log(String msg) {
34750e41d0d9c179e9628098cdddb12546b8882839fSailesh Nepal        Log.w("telecomtestcs", "[TestConnectionManager] " + msg);
348c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    }
349c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
3508000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    private final Map<RemoteConference, TestManagedConference> mManagedConferenceByRemote
3518000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            = new HashMap<>();
3528000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    private final Map<RemoteConnection, TestManagedConnection> mManagedConnectionByRemote
3538000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad            = new HashMap<>();
3548000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
355c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    @Override
356c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    public Connection onCreateOutgoingConnection(
357c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            PhoneAccountHandle connectionManagerAccount,
358c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            final ConnectionRequest request) {
3598000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        return makeConnection(request, false);
360c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    }
361c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad
362c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    @Override
363c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    public Connection onCreateIncomingConnection(
364c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            PhoneAccountHandle connectionManagerAccount,
365c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad            final ConnectionRequest request) {
3668000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        return makeConnection(request, true);
3678000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    }
3688000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
3698000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    @Override
3708000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    public void onConference(Connection a, Connection b) {
3718000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        conferenceRemoteConnections(
3728000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                ((TestManagedConnection) a).mRemote,
3738000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                ((TestManagedConnection) b).mRemote);
3748000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    }
3758000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
3768000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    @Override
3778000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    public void onRemoteConferenceAdded(RemoteConference remoteConference) {
3788000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        addConference(new TestManagedConference(remoteConference));
3798000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    }
3808000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad
381a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad    Map<RemoteConnection, TestManagedConnection> getManagedConnectionByRemote() {
382a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad        return mManagedConnectionByRemote;
383a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad    }
384a123a5b741135a4f97a997e498a88ab33257d72dIhab Awad
3858000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad    private Connection makeConnection(ConnectionRequest request, boolean incoming) {
3868000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        RemoteConnection remote = incoming
3878000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                ? createRemoteIncomingConnection(request.getAccountHandle(), request)
3888000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad                : createRemoteOutgoingConnection(request.getAccountHandle(), request);
3898000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        TestManagedConnection local = new TestManagedConnection(remote, false);
3908000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        mManagedConnectionByRemote.put(remote, local);
3918000845a81fd6a88ff69cb11e1b6dff5f47c2332Ihab Awad        return local;
392c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad    }
393c17294cfaf9cc649a362117fba544f0b5cb18cdfIhab Awad}
394