blob: 70efcb1903f7df605caf64f51ddac436a6928fcc [file] [log] [blame]
Santos Cordon52d8a152014-06-17 19:08:45 -07001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
Ihab Awadb19a0bc2014-08-07 19:46:01 -070014 * limitations under the License.
Santos Cordon52d8a152014-06-17 19:08:45 -070015 */
16
Tyler Gunnef9f6f92014-09-12 22:16:17 -070017package android.telecom;
Santos Cordon52d8a152014-06-17 19:08:45 -070018
Santos Cordon52d8a152014-06-17 19:08:45 -070019import android.net.Uri;
Omkar Kolangadeb6e14462014-08-28 11:13:58 -070020import android.os.Bundle;
Ihab Awad5d0410f2014-07-30 10:07:40 -070021import android.os.IBinder;
Santos Cordone8dc4be2014-07-21 01:28:28 -070022import android.os.IBinder.DeathRecipient;
Santos Cordon52d8a152014-06-17 19:08:45 -070023import android.os.RemoteException;
Santos Cordon52d8a152014-06-17 19:08:45 -070024
Tyler Gunnef9f6f92014-09-12 22:16:17 -070025import com.android.internal.telecom.IConnectionService;
26import com.android.internal.telecom.IConnectionServiceAdapter;
27import com.android.internal.telecom.IVideoProvider;
28import com.android.internal.telecom.RemoteServiceCallback;
Santos Cordon52d8a152014-06-17 19:08:45 -070029
Ihab Awadb8e85c72014-08-23 20:34:57 -070030import java.util.ArrayList;
Ihab Awad5d0410f2014-07-30 10:07:40 -070031import java.util.HashMap;
32import java.util.HashSet;
33import java.util.Map;
34import java.util.Set;
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070035import java.util.List;
Santos Cordon52d8a152014-06-17 19:08:45 -070036import java.util.UUID;
37
38/**
39 * Remote connection service which other connection services can use to place calls on their behalf.
Sailesh Nepal091768c2014-06-30 15:15:23 -070040 *
41 * @hide
Santos Cordon52d8a152014-06-17 19:08:45 -070042 */
Ihab Awad5d0410f2014-07-30 10:07:40 -070043final class RemoteConnectionService {
Sailesh Nepal48031592014-07-18 14:21:23 -070044
Tyler Gunnbf1961f2014-10-30 14:27:48 -070045 // Note: Casting null to avoid ambiguous constructor reference.
Ihab Awadb8e85c72014-08-23 20:34:57 -070046 private static final RemoteConnection NULL_CONNECTION =
Tyler Gunnbf1961f2014-10-30 14:27:48 -070047 new RemoteConnection("NULL", null, (ConnectionRequest) null);
Ihab Awadb8e85c72014-08-23 20:34:57 -070048
49 private static final RemoteConference NULL_CONFERENCE =
50 new RemoteConference("NULL", null);
Santos Cordon52d8a152014-06-17 19:08:45 -070051
Ihab Awad5d0410f2014-07-30 10:07:40 -070052 private final IConnectionServiceAdapter mServantDelegate = new IConnectionServiceAdapter() {
Sailesh Nepal48031592014-07-18 14:21:23 -070053 @Override
Ihab Awad6107bab2014-08-18 09:23:25 -070054 public void handleCreateConnectionComplete(
Ihab Awadb19a0bc2014-08-07 19:46:01 -070055 String id,
56 ConnectionRequest request,
Ihab Awad5d0410f2014-07-30 10:07:40 -070057 ParcelableConnection parcel) {
Ihab Awadb19a0bc2014-08-07 19:46:01 -070058 RemoteConnection connection =
59 findConnectionForAction(id, "handleCreateConnectionSuccessful");
Ihab Awad5d0410f2014-07-30 10:07:40 -070060 if (connection != NULL_CONNECTION && mPendingConnections.contains(connection)) {
61 mPendingConnections.remove(connection);
Ihab Awad6107bab2014-08-18 09:23:25 -070062 // Unconditionally initialize the connection ...
Ihab Awad4a0d2722014-11-12 13:41:16 -080063 connection.setConnectionCapabilities(parcel.getConnectionCapabilities());
64 connection.setCallProperties(parcel.getProperties());
Andrew Lee100e2932014-09-08 15:34:24 -070065 connection.setAddress(
Ihab Awad5d0410f2014-07-30 10:07:40 -070066 parcel.getHandle(), parcel.getHandlePresentation());
67 connection.setCallerDisplayName(
68 parcel.getCallerDisplayName(),
69 parcel.getCallerDisplayNamePresentation());
Sailesh Nepal70638f12014-09-09 21:49:14 -070070 // Set state after handle so that the client can identify the connection.
Sailesh Nepalc2a978d2014-09-20 18:23:05 -070071 if (parcel.getState() == Connection.STATE_DISCONNECTED) {
72 connection.setDisconnected(parcel.getDisconnectCause());
73 } else {
74 connection.setState(parcel.getState());
75 }
Ihab Awadb8e85c72014-08-23 20:34:57 -070076 List<RemoteConnection> conferenceable = new ArrayList<>();
77 for (String confId : parcel.getConferenceableConnectionIds()) {
78 if (mConnectionById.containsKey(confId)) {
79 conferenceable.add(mConnectionById.get(confId));
80 }
81 }
82 connection.setConferenceableConnections(conferenceable);
Ihab Awada64627c2014-08-20 09:36:40 -070083 connection.setVideoState(parcel.getVideoState());
Nivedita Sarkar1fc1c3f2014-10-27 11:46:22 -070084 connection.setCallSubstate(parcel.getCallSubstate());
Ihab Awad6107bab2014-08-18 09:23:25 -070085 if (connection.getState() == Connection.STATE_DISCONNECTED) {
86 // ... then, if it was created in a disconnected state, that indicates
87 // failure on the providing end, so immediately mark it destroyed
88 connection.setDestroyed();
89 }
Sailesh Nepal48031592014-07-18 14:21:23 -070090 }
91 }
Sailesh Nepal2ab88cc2014-07-18 14:49:18 -070092
Sailesh Nepal2a46b902014-07-04 17:21:07 -070093 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -070094 public void setActive(String callId) {
Ihab Awadb8e85c72014-08-23 20:34:57 -070095 if (mConnectionById.containsKey(callId)) {
96 findConnectionForAction(callId, "setActive")
97 .setState(Connection.STATE_ACTIVE);
98 } else {
99 findConferenceForAction(callId, "setActive")
100 .setState(Connection.STATE_ACTIVE);
101 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700102 }
103
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700104 @Override
Omkar Kolangadeb6e14462014-08-28 11:13:58 -0700105 public void setExtras(String callId, Bundle extras) {
106 // NOTE: Should this be a no-op?
107 }
108
109 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700110 public void setRinging(String callId) {
111 findConnectionForAction(callId, "setRinging")
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700112 .setState(Connection.STATE_RINGING);
Andrew Lee5ffbe8b2014-06-20 16:29:33 -0700113 }
114
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700115 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700116 public void setDialing(String callId) {
117 findConnectionForAction(callId, "setDialing")
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700118 .setState(Connection.STATE_DIALING);
Santos Cordon52d8a152014-06-17 19:08:45 -0700119 }
120
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700121 @Override
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700122 public void setDisconnected(String callId, DisconnectCause disconnectCause) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700123 if (mConnectionById.containsKey(callId)) {
124 findConnectionForAction(callId, "setDisconnected")
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700125 .setDisconnected(disconnectCause);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700126 } else {
127 findConferenceForAction(callId, "setDisconnected")
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700128 .setDisconnected(disconnectCause);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700129 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700130 }
131
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700132 @Override
Ravindra Thattahalli Javaraiahce75a422014-08-27 11:30:29 +0530133 public void setDisconnectedWithSsNotification(String callId, int disconnectCause,
134 String disconnectMessage, int type, int code) {
135 findConnectionForAction(callId, "setDisconnectedWithSsNotification")
136 .setDisconnectedWithSsNotification(disconnectCause, disconnectMessage,
137 type, code);
138 }
139
140 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700141 public void setOnHold(String callId) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700142 if (mConnectionById.containsKey(callId)) {
143 findConnectionForAction(callId, "setOnHold")
144 .setState(Connection.STATE_HOLDING);
145 } else {
146 findConferenceForAction(callId, "setOnHold")
147 .setState(Connection.STATE_HOLDING);
148 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700149 }
150
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700151 @Override
Andrew Lee100e2932014-09-08 15:34:24 -0700152 public void setRingbackRequested(String callId, boolean ringing) {
153 findConnectionForAction(callId, "setRingbackRequested")
154 .setRingbackRequested(ringing);
Santos Cordon52d8a152014-06-17 19:08:45 -0700155 }
156
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700157 @Override
Ihab Awad4a0d2722014-11-12 13:41:16 -0800158 public void setConnectionCapabilities(String callId, int connectionCapabilities) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700159 if (mConnectionById.containsKey(callId)) {
Ihab Awad4a0d2722014-11-12 13:41:16 -0800160 findConnectionForAction(callId, "setConnectionCapabilities")
161 .setConnectionCapabilities(connectionCapabilities);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700162 } else {
Ihab Awad4a0d2722014-11-12 13:41:16 -0800163 findConferenceForAction(callId, "setConnectionCapabilities")
164 .setConnectionCapabilities(connectionCapabilities);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700165 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700166 }
167
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700168 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700169 public void setIsConferenced(String callId, String conferenceCallId) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700170 // Note: callId should not be null; conferenceCallId may be null
171 RemoteConnection connection =
172 findConnectionForAction(callId, "setIsConferenced");
173 if (connection != NULL_CONNECTION) {
174 if (conferenceCallId == null) {
175 // 'connection' is being split from its conference
176 if (connection.getConference() != null) {
177 connection.getConference().removeConnection(connection);
178 }
179 } else {
180 RemoteConference conference =
181 findConferenceForAction(conferenceCallId, "setIsConferenced");
182 if (conference != NULL_CONFERENCE) {
183 conference.addConnection(connection);
184 }
185 }
186 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700187 }
188
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700189 @Override
Ihab Awadb8e85c72014-08-23 20:34:57 -0700190 public void addConferenceCall(
191 final String callId,
192 ParcelableConference parcel) {
193 RemoteConference conference = new RemoteConference(callId,
194 mOutgoingConnectionServiceRpc);
195
196 for (String id : parcel.getConnectionIds()) {
197 RemoteConnection c = mConnectionById.get(id);
198 if (c != null) {
199 conference.addConnection(c);
200 }
201 }
202
203 if (conference.getConnections().size() == 0) {
204 // A conference was created, but none of its connections are ones that have been
205 // created by, and therefore being tracked by, this remote connection service. It
206 // is of no interest to us.
207 return;
208 }
209
210 conference.setState(parcel.getState());
Ihab Awad4a0d2722014-11-12 13:41:16 -0800211 conference.setConnectionCapabilities(parcel.getConnectionCapabilities());
Ihab Awadb8e85c72014-08-23 20:34:57 -0700212 mConferenceById.put(callId, conference);
Andrew Lee100e2932014-09-08 15:34:24 -0700213 conference.registerCallback(new RemoteConference.Callback() {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700214 @Override
215 public void onDestroyed(RemoteConference c) {
216 mConferenceById.remove(callId);
217 maybeDisconnectAdapter();
218 }
219 });
220
221 mOurConnectionServiceImpl.addRemoteConference(conference);
Santos Cordon52d8a152014-06-17 19:08:45 -0700222 }
223
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700224 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700225 public void removeCall(String callId) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700226 if (mConnectionById.containsKey(callId)) {
227 findConnectionForAction(callId, "removeCall")
228 .setDestroyed();
229 } else {
230 findConferenceForAction(callId, "removeCall")
231 .setDestroyed();
232 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700233 }
234
Sailesh Nepal2a46b902014-07-04 17:21:07 -0700235 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700236 public void onPostDialWait(String callId, String remaining) {
237 findConnectionForAction(callId, "onPostDialWait")
238 .setPostDialWait(remaining);
Santos Cordon52d8a152014-06-17 19:08:45 -0700239 }
240
Santos Cordon52d8a152014-06-17 19:08:45 -0700241 @Override
Nancy Chen70f75712014-12-15 16:12:50 -0800242 public void onPostDialChar(String callId, char nextChar) {
243 findConnectionForAction(callId, "onPostDialChar")
244 .onPostDialChar(nextChar);
245 }
246
247 @Override
Santos Cordon52d8a152014-06-17 19:08:45 -0700248 public void queryRemoteConnectionServices(RemoteServiceCallback callback) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700249 // Not supported from remote connection service.
Santos Cordon52d8a152014-06-17 19:08:45 -0700250 }
Tyler Gunn8d83fa92014-07-01 11:31:21 -0700251
Sailesh Nepal33aaae42014-07-07 22:49:44 -0700252 @Override
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700253 public void setVideoProvider(String callId, IVideoProvider videoProvider) {
Ihab Awada64627c2014-08-20 09:36:40 -0700254 findConnectionForAction(callId, "setVideoProvider")
255 .setVideoProvider(new RemoteConnection.VideoProvider(videoProvider));
Tyler Gunnaa07df82014-07-17 07:50:22 -0700256 }
257
258 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700259 public void setVideoState(String callId, int videoState) {
260 findConnectionForAction(callId, "setVideoState")
261 .setVideoState(videoState);
Sailesh Nepal33aaae42014-07-07 22:49:44 -0700262 }
Sailesh Nepale7ef59a2014-07-08 21:48:22 -0700263
Sailesh Nepale7ef59a2014-07-08 21:48:22 -0700264 @Override
Andrew Lee100e2932014-09-08 15:34:24 -0700265 public void setIsVoipAudioMode(String callId, boolean isVoip) {
266 findConnectionForAction(callId, "setIsVoipAudioMode")
267 .setIsVoipAudioMode(isVoip);
Sailesh Nepale7ef59a2014-07-08 21:48:22 -0700268 }
Sailesh Nepal61203862014-07-11 14:50:13 -0700269
270 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700271 public void setStatusHints(String callId, StatusHints statusHints) {
272 findConnectionForAction(callId, "setStatusHints")
273 .setStatusHints(statusHints);
Sailesh Nepal61203862014-07-11 14:50:13 -0700274 }
275
276 @Override
Andrew Lee100e2932014-09-08 15:34:24 -0700277 public void setAddress(String callId, Uri address, int presentation) {
278 findConnectionForAction(callId, "setAddress")
279 .setAddress(address, presentation);
Sailesh Nepal61203862014-07-11 14:50:13 -0700280 }
Sailesh Nepal2ab88cc2014-07-18 14:49:18 -0700281
282 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700283 public void setCallerDisplayName(String callId, String callerDisplayName,
284 int presentation) {
285 findConnectionForAction(callId, "setCallerDisplayName")
286 .setCallerDisplayName(callerDisplayName, presentation);
287 }
288
289 @Override
Ihab Awad5d0410f2014-07-30 10:07:40 -0700290 public IBinder asBinder() {
291 throw new UnsupportedOperationException();
Sailesh Nepal2ab88cc2014-07-18 14:49:18 -0700292 }
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700293
294 @Override
295 public final void setConferenceableConnections(
296 String callId, List<String> conferenceableConnectionIds) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700297 List<RemoteConnection> conferenceable = new ArrayList<>();
298 for (String id : conferenceableConnectionIds) {
299 if (mConnectionById.containsKey(id)) {
300 conferenceable.add(mConnectionById.get(id));
301 }
302 }
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700303
Ihab Awad50e35062014-09-30 09:17:03 -0700304 if (hasConnection(callId)) {
305 findConnectionForAction(callId, "setConferenceableConnections")
306 .setConferenceableConnections(conferenceable);
307 } else {
308 findConferenceForAction(callId, "setConferenceableConnections")
309 .setConferenceableConnections(conferenceable);
310 }
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700311 }
Sandeep Gutta4c5053c2014-09-24 23:52:00 +0530312
313 @Override
314 public void setPhoneAccountHandle(String callId, PhoneAccountHandle pHandle) {
315 findConnectionForAction(callId, "setPhoneAccountHandle")
316 .setPhoneAccountHandle(pHandle);
317 }
Nivedita Sarkar1fc1c3f2014-10-27 11:46:22 -0700318
319 @Override
320 public void setCallSubstate(String callId, int callSubstate) {
321 findConnectionForAction(callId, "callSubstate")
322 .setCallSubstate(callSubstate);
323 }
Tyler Gunnbf1961f2014-10-30 14:27:48 -0700324
325 @Override
326 public void addExistingConnection(String callId, ParcelableConnection connection) {
327 // TODO: add contents of this method
328 RemoteConnection remoteConnction = new RemoteConnection(callId,
329 mOutgoingConnectionServiceRpc, connection);
330
331 mOurConnectionServiceImpl.addRemoteExistingConnection(remoteConnction);
332 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700333 };
334
Ihab Awad5d0410f2014-07-30 10:07:40 -0700335 private final ConnectionServiceAdapterServant mServant =
336 new ConnectionServiceAdapterServant(mServantDelegate);
Santos Cordon52d8a152014-06-17 19:08:45 -0700337
Ihab Awad5d0410f2014-07-30 10:07:40 -0700338 private final DeathRecipient mDeathRecipient = new DeathRecipient() {
339 @Override
340 public void binderDied() {
341 for (RemoteConnection c : mConnectionById.values()) {
342 c.setDestroyed();
343 }
Ihab Awadb8e85c72014-08-23 20:34:57 -0700344 for (RemoteConference c : mConferenceById.values()) {
345 c.setDestroyed();
346 }
Ihab Awad5d0410f2014-07-30 10:07:40 -0700347 mConnectionById.clear();
Ihab Awadb8e85c72014-08-23 20:34:57 -0700348 mConferenceById.clear();
Ihab Awad5d0410f2014-07-30 10:07:40 -0700349 mPendingConnections.clear();
Ihab Awadb8e85c72014-08-23 20:34:57 -0700350 mOutgoingConnectionServiceRpc.asBinder().unlinkToDeath(mDeathRecipient, 0);
Ihab Awad5d0410f2014-07-30 10:07:40 -0700351 }
352 };
353
Ihab Awadb8e85c72014-08-23 20:34:57 -0700354 private final IConnectionService mOutgoingConnectionServiceRpc;
355 private final ConnectionService mOurConnectionServiceImpl;
Ihab Awad5d0410f2014-07-30 10:07:40 -0700356 private final Map<String, RemoteConnection> mConnectionById = new HashMap<>();
Ihab Awadb8e85c72014-08-23 20:34:57 -0700357 private final Map<String, RemoteConference> mConferenceById = new HashMap<>();
Ihab Awad5d0410f2014-07-30 10:07:40 -0700358 private final Set<RemoteConnection> mPendingConnections = new HashSet<>();
359
Ihab Awadb8e85c72014-08-23 20:34:57 -0700360 RemoteConnectionService(
361 IConnectionService outgoingConnectionServiceRpc,
362 ConnectionService ourConnectionServiceImpl) throws RemoteException {
363 mOutgoingConnectionServiceRpc = outgoingConnectionServiceRpc;
364 mOutgoingConnectionServiceRpc.asBinder().linkToDeath(mDeathRecipient, 0);
365 mOurConnectionServiceImpl = ourConnectionServiceImpl;
Santos Cordon52d8a152014-06-17 19:08:45 -0700366 }
367
368 @Override
369 public String toString() {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700370 return "[RemoteCS - " + mOutgoingConnectionServiceRpc.asBinder().toString() + "]";
Santos Cordon52d8a152014-06-17 19:08:45 -0700371 }
372
Ihab Awadf8b69882014-07-25 15:14:01 -0700373 final RemoteConnection createRemoteConnection(
374 PhoneAccountHandle connectionManagerPhoneAccount,
375 ConnectionRequest request,
376 boolean isIncoming) {
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700377 final String id = UUID.randomUUID().toString();
Ihab Awad8aecfed2014-08-08 17:06:11 -0700378 final ConnectionRequest newRequest = new ConnectionRequest(
Ihab Awad5d0410f2014-07-30 10:07:40 -0700379 request.getAccountHandle(),
Nancy Chenea38cca2014-09-05 16:38:49 -0700380 request.getAddress(),
Ihab Awad5d0410f2014-07-30 10:07:40 -0700381 request.getExtras(),
382 request.getVideoState());
383 try {
Ihab Awad8aecfed2014-08-08 17:06:11 -0700384 if (mConnectionById.isEmpty()) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700385 mOutgoingConnectionServiceRpc.addConnectionServiceAdapter(mServant.getStub());
Ihab Awad8aecfed2014-08-08 17:06:11 -0700386 }
387 RemoteConnection connection =
Ihab Awadb8e85c72014-08-23 20:34:57 -0700388 new RemoteConnection(id, mOutgoingConnectionServiceRpc, newRequest);
Ihab Awad8aecfed2014-08-08 17:06:11 -0700389 mPendingConnections.add(connection);
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700390 mConnectionById.put(id, connection);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700391 mOutgoingConnectionServiceRpc.createConnection(
Ihab Awad5d0410f2014-07-30 10:07:40 -0700392 connectionManagerPhoneAccount,
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700393 id,
Ihab Awad5d0410f2014-07-30 10:07:40 -0700394 newRequest,
Yorke Leec3cf9822014-10-02 09:38:39 -0700395 isIncoming,
396 false /* isUnknownCall */);
Andrew Lee100e2932014-09-08 15:34:24 -0700397 connection.registerCallback(new RemoteConnection.Callback() {
Ihab Awad8aecfed2014-08-08 17:06:11 -0700398 @Override
399 public void onDestroyed(RemoteConnection connection) {
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700400 mConnectionById.remove(id);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700401 maybeDisconnectAdapter();
Ihab Awad8aecfed2014-08-08 17:06:11 -0700402 }
403 });
Ihab Awad5d0410f2014-07-30 10:07:40 -0700404 return connection;
405 } catch (RemoteException e) {
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700406 return RemoteConnection.failure(
407 new DisconnectCause(DisconnectCause.ERROR, e.toString()));
Santos Cordon52d8a152014-06-17 19:08:45 -0700408 }
409 }
410
Ihab Awad50e35062014-09-30 09:17:03 -0700411 private boolean hasConnection(String callId) {
mike dooley879142b2014-10-08 13:39:28 -0700412 return mConnectionById.containsKey(callId);
Ihab Awad50e35062014-09-30 09:17:03 -0700413 }
414
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700415 private RemoteConnection findConnectionForAction(
416 String callId, String action) {
Ihab Awad5d0410f2014-07-30 10:07:40 -0700417 if (mConnectionById.containsKey(callId)) {
418 return mConnectionById.get(callId);
419 }
420 Log.w(this, "%s - Cannot find Connection %s", action, callId);
421 return NULL_CONNECTION;
Santos Cordon52d8a152014-06-17 19:08:45 -0700422 }
Ihab Awadb8e85c72014-08-23 20:34:57 -0700423
424 private RemoteConference findConferenceForAction(
425 String callId, String action) {
426 if (mConferenceById.containsKey(callId)) {
427 return mConferenceById.get(callId);
428 }
429 Log.w(this, "%s - Cannot find Conference %s", action, callId);
430 return NULL_CONFERENCE;
431 }
432
433 private void maybeDisconnectAdapter() {
434 if (mConnectionById.isEmpty() && mConferenceById.isEmpty()) {
435 try {
436 mOutgoingConnectionServiceRpc.removeConnectionServiceAdapter(mServant.getStub());
437 } catch (RemoteException e) {
438 }
439 }
440 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700441}