blob: e024e61865190969d86e819ad8c07d6e0034b6a1 [file] [log] [blame]
Ihab Awadb8e85c72014-08-23 20:34:57 -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
14 * limitations under the License.
15 */
16
Tyler Gunnef9f6f92014-09-12 22:16:17 -070017package android.telecom;
Ihab Awadb8e85c72014-08-23 20:34:57 -070018
Santos Cordon6b7f9552015-05-27 17:21:45 -070019import android.annotation.Nullable;
Yorke Lee4af59352015-05-13 14:14:54 -070020import android.annotation.SystemApi;
Santos Cordon6b7f9552015-05-27 17:21:45 -070021import android.os.Bundle;
Andrew Lee011728f2015-04-23 15:47:06 -070022import android.os.Handler;
Ihab Awadb8e85c72014-08-23 20:34:57 -070023import android.os.RemoteException;
Ihab Awadb8e85c72014-08-23 20:34:57 -070024
Grace Jia9a09c672020-08-04 12:52:09 -070025import com.android.internal.telecom.IConnectionService;
26
Ihab Awad50e35062014-09-30 09:17:03 -070027import java.util.ArrayList;
Ihab Awadb8e85c72014-08-23 20:34:57 -070028import java.util.Collections;
29import java.util.List;
30import java.util.Set;
31import java.util.concurrent.CopyOnWriteArrayList;
32import java.util.concurrent.CopyOnWriteArraySet;
33
34/**
Santos Cordon895d4b82015-06-25 16:41:48 -070035 * A conference provided to a {@link ConnectionService} by another {@code ConnectionService} through
36 * {@link ConnectionService#conferenceRemoteConnections}. Once created, a {@code RemoteConference}
37 * can be used to control the conference call or monitor changes through
38 * {@link RemoteConnection.Callback}.
Santos Cordonb804f8d2015-05-12 12:09:47 -070039 *
40 * @see ConnectionService#onRemoteConferenceAdded
Ihab Awadb8e85c72014-08-23 20:34:57 -070041 */
42public final class RemoteConference {
43
Santos Cordon895d4b82015-06-25 16:41:48 -070044 /**
45 * Callback base class for {@link RemoteConference}.
46 */
Nancy Chen1d834f52014-09-05 11:03:21 -070047 public abstract static class Callback {
Santos Cordon895d4b82015-06-25 16:41:48 -070048 /**
49 * Invoked when the state of this {@code RemoteConferece} has changed. See
50 * {@link #getState()}.
51 *
52 * @param conference The {@code RemoteConference} invoking this method.
53 * @param oldState The previous state of the {@code RemoteConference}.
54 * @param newState The new state of the {@code RemoteConference}.
55 */
Ihab Awadb8e85c72014-08-23 20:34:57 -070056 public void onStateChanged(RemoteConference conference, int oldState, int newState) {}
Santos Cordon895d4b82015-06-25 16:41:48 -070057
58 /**
59 * Invoked when this {@code RemoteConference} is disconnected.
60 *
61 * @param conference The {@code RemoteConference} invoking this method.
62 * @param disconnectCause The ({@see DisconnectCause}) associated with this failed
63 * conference.
64 */
Andrew Lee7f3d41f2014-09-11 17:33:16 -070065 public void onDisconnected(RemoteConference conference, DisconnectCause disconnectCause) {}
Santos Cordon895d4b82015-06-25 16:41:48 -070066
67 /**
68 * Invoked when a {@link RemoteConnection} is added to the conference call.
69 *
70 * @param conference The {@code RemoteConference} invoking this method.
71 * @param connection The {@link RemoteConnection} being added.
72 */
Ihab Awadb8e85c72014-08-23 20:34:57 -070073 public void onConnectionAdded(RemoteConference conference, RemoteConnection connection) {}
Santos Cordon895d4b82015-06-25 16:41:48 -070074
75 /**
76 * Invoked when a {@link RemoteConnection} is removed from the conference call.
77 *
78 * @param conference The {@code RemoteConference} invoking this method.
79 * @param connection The {@link RemoteConnection} being removed.
80 */
Ihab Awadb8e85c72014-08-23 20:34:57 -070081 public void onConnectionRemoved(RemoteConference conference, RemoteConnection connection) {}
Santos Cordon895d4b82015-06-25 16:41:48 -070082
83 /**
84 * Indicates that the call capabilities of this {@code RemoteConference} have changed.
85 * See {@link #getConnectionCapabilities()}.
86 *
87 * @param conference The {@code RemoteConference} invoking this method.
88 * @param connectionCapabilities The new capabilities of the {@code RemoteConference}.
89 */
Ihab Awad5c9c86e2014-11-12 13:41:16 -080090 public void onConnectionCapabilitiesChanged(
91 RemoteConference conference,
92 int connectionCapabilities) {}
Santos Cordon895d4b82015-06-25 16:41:48 -070093
94 /**
Tyler Gunn720c6642016-03-22 09:02:47 -070095 * Indicates that the call properties of this {@code RemoteConference} have changed.
96 * See {@link #getConnectionProperties()}.
97 *
98 * @param conference The {@code RemoteConference} invoking this method.
99 * @param connectionProperties The new properties of the {@code RemoteConference}.
100 */
101 public void onConnectionPropertiesChanged(
102 RemoteConference conference,
103 int connectionProperties) {}
104
105
106 /**
Santos Cordon895d4b82015-06-25 16:41:48 -0700107 * Invoked when the set of {@link RemoteConnection}s which can be added to this conference
108 * call have changed.
109 *
110 * @param conference The {@code RemoteConference} invoking this method.
111 * @param conferenceableConnections The list of conferenceable {@link RemoteConnection}s.
112 */
Ihab Awad50e35062014-09-30 09:17:03 -0700113 public void onConferenceableConnectionsChanged(
114 RemoteConference conference,
115 List<RemoteConnection> conferenceableConnections) {}
Santos Cordon895d4b82015-06-25 16:41:48 -0700116
117 /**
118 * Indicates that this {@code RemoteConference} has been destroyed. No further requests
119 * should be made to the {@code RemoteConference}, and references to it should be cleared.
120 *
121 * @param conference The {@code RemoteConference} invoking this method.
122 */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700123 public void onDestroyed(RemoteConference conference) {}
Santos Cordon895d4b82015-06-25 16:41:48 -0700124
125 /**
126 * Handles changes to the {@code RemoteConference} extras.
127 *
128 * @param conference The {@code RemoteConference} invoking this method.
129 * @param extras The extras containing other information associated with the conference.
130 */
Santos Cordon6b7f9552015-05-27 17:21:45 -0700131 public void onExtrasChanged(RemoteConference conference, @Nullable Bundle extras) {}
Ihab Awadb8e85c72014-08-23 20:34:57 -0700132 }
133
134 private final String mId;
135 private final IConnectionService mConnectionService;
136
Andrew Lee011728f2015-04-23 15:47:06 -0700137 private final Set<CallbackRecord<Callback>> mCallbackRecords = new CopyOnWriteArraySet<>();
Ihab Awadb8e85c72014-08-23 20:34:57 -0700138 private final List<RemoteConnection> mChildConnections = new CopyOnWriteArrayList<>();
139 private final List<RemoteConnection> mUnmodifiableChildConnections =
140 Collections.unmodifiableList(mChildConnections);
Ihab Awad50e35062014-09-30 09:17:03 -0700141 private final List<RemoteConnection> mConferenceableConnections = new ArrayList<>();
142 private final List<RemoteConnection> mUnmodifiableConferenceableConnections =
143 Collections.unmodifiableList(mConferenceableConnections);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700144
145 private int mState = Connection.STATE_NEW;
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700146 private DisconnectCause mDisconnectCause;
Ihab Awad5c9c86e2014-11-12 13:41:16 -0800147 private int mConnectionCapabilities;
Tyler Gunn720c6642016-03-22 09:02:47 -0700148 private int mConnectionProperties;
Santos Cordon6b7f9552015-05-27 17:21:45 -0700149 private Bundle mExtras;
Ihab Awadb8e85c72014-08-23 20:34:57 -0700150
Santos Cordonb804f8d2015-05-12 12:09:47 -0700151 /** @hide */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700152 RemoteConference(String id, IConnectionService connectionService) {
153 mId = id;
154 mConnectionService = connectionService;
155 }
156
Santos Cordonb804f8d2015-05-12 12:09:47 -0700157 /** @hide */
Grace Jia9a09c672020-08-04 12:52:09 -0700158 RemoteConference(DisconnectCause disconnectCause) {
159 mId = "NULL";
160 mConnectionService = null;
161 mState = Connection.STATE_DISCONNECTED;
162 mDisconnectCause = disconnectCause;
163 }
164
165 /** @hide */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700166 String getId() {
167 return mId;
168 }
169
Santos Cordonb804f8d2015-05-12 12:09:47 -0700170 /** @hide */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700171 void setDestroyed() {
172 for (RemoteConnection connection : mChildConnections) {
173 connection.setConference(null);
174 }
Andrew Lee011728f2015-04-23 15:47:06 -0700175 for (CallbackRecord<Callback> record : mCallbackRecords) {
176 final RemoteConference conference = this;
177 final Callback callback = record.getCallback();
178 record.getHandler().post(new Runnable() {
179 @Override
180 public void run() {
181 callback.onDestroyed(conference);
182 }
183 });
Ihab Awadb8e85c72014-08-23 20:34:57 -0700184 }
185 }
186
Santos Cordonb804f8d2015-05-12 12:09:47 -0700187 /** @hide */
Andrew Lee011728f2015-04-23 15:47:06 -0700188 void setState(final int newState) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700189 if (newState != Connection.STATE_ACTIVE &&
190 newState != Connection.STATE_HOLDING &&
191 newState != Connection.STATE_DISCONNECTED) {
192 Log.w(this, "Unsupported state transition for Conference call.",
193 Connection.stateToString(newState));
194 return;
195 }
196
197 if (mState != newState) {
Andrew Lee011728f2015-04-23 15:47:06 -0700198 final int oldState = mState;
Ihab Awadb8e85c72014-08-23 20:34:57 -0700199 mState = newState;
Andrew Lee011728f2015-04-23 15:47:06 -0700200 for (CallbackRecord<Callback> record : mCallbackRecords) {
201 final RemoteConference conference = this;
202 final Callback callback = record.getCallback();
203 record.getHandler().post(new Runnable() {
204 @Override
205 public void run() {
206 callback.onStateChanged(conference, oldState, newState);
207 }
208 });
Ihab Awadb8e85c72014-08-23 20:34:57 -0700209 }
210 }
211 }
212
Santos Cordonb804f8d2015-05-12 12:09:47 -0700213 /** @hide */
Andrew Lee011728f2015-04-23 15:47:06 -0700214 void addConnection(final RemoteConnection connection) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700215 if (!mChildConnections.contains(connection)) {
216 mChildConnections.add(connection);
217 connection.setConference(this);
Andrew Lee011728f2015-04-23 15:47:06 -0700218 for (CallbackRecord<Callback> record : mCallbackRecords) {
219 final RemoteConference conference = this;
220 final Callback callback = record.getCallback();
221 record.getHandler().post(new Runnable() {
222 @Override
223 public void run() {
224 callback.onConnectionAdded(conference, connection);
225 }
226 });
Ihab Awadb8e85c72014-08-23 20:34:57 -0700227 }
228 }
229 }
230
Santos Cordonb804f8d2015-05-12 12:09:47 -0700231 /** @hide */
Andrew Lee011728f2015-04-23 15:47:06 -0700232 void removeConnection(final RemoteConnection connection) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700233 if (mChildConnections.contains(connection)) {
234 mChildConnections.remove(connection);
235 connection.setConference(null);
Andrew Lee011728f2015-04-23 15:47:06 -0700236 for (CallbackRecord<Callback> record : mCallbackRecords) {
237 final RemoteConference conference = this;
238 final Callback callback = record.getCallback();
239 record.getHandler().post(new Runnable() {
240 @Override
241 public void run() {
242 callback.onConnectionRemoved(conference, connection);
243 }
244 });
Ihab Awadb8e85c72014-08-23 20:34:57 -0700245 }
246 }
247 }
248
Santos Cordonb804f8d2015-05-12 12:09:47 -0700249 /** @hide */
Andrew Lee011728f2015-04-23 15:47:06 -0700250 void setConnectionCapabilities(final int connectionCapabilities) {
Ihab Awad5c9c86e2014-11-12 13:41:16 -0800251 if (mConnectionCapabilities != connectionCapabilities) {
252 mConnectionCapabilities = connectionCapabilities;
Andrew Lee011728f2015-04-23 15:47:06 -0700253 for (CallbackRecord<Callback> record : mCallbackRecords) {
254 final RemoteConference conference = this;
255 final Callback callback = record.getCallback();
256 record.getHandler().post(new Runnable() {
257 @Override
258 public void run() {
259 callback.onConnectionCapabilitiesChanged(
260 conference, mConnectionCapabilities);
261 }
262 });
Ihab Awadb8e85c72014-08-23 20:34:57 -0700263 }
264 }
265 }
266
Ihab Awad50e35062014-09-30 09:17:03 -0700267 /** @hide */
Tyler Gunn720c6642016-03-22 09:02:47 -0700268 void setConnectionProperties(final int connectionProperties) {
269 if (mConnectionProperties != connectionProperties) {
270 mConnectionProperties = connectionProperties;
271 for (CallbackRecord<Callback> record : mCallbackRecords) {
272 final RemoteConference conference = this;
273 final Callback callback = record.getCallback();
274 record.getHandler().post(new Runnable() {
275 @Override
276 public void run() {
277 callback.onConnectionPropertiesChanged(
278 conference, mConnectionProperties);
279 }
280 });
281 }
282 }
283 }
284
285 /** @hide */
Ihab Awad50e35062014-09-30 09:17:03 -0700286 void setConferenceableConnections(List<RemoteConnection> conferenceableConnections) {
287 mConferenceableConnections.clear();
288 mConferenceableConnections.addAll(conferenceableConnections);
Andrew Lee011728f2015-04-23 15:47:06 -0700289 for (CallbackRecord<Callback> record : mCallbackRecords) {
290 final RemoteConference conference = this;
291 final Callback callback = record.getCallback();
292 record.getHandler().post(new Runnable() {
293 @Override
294 public void run() {
295 callback.onConferenceableConnectionsChanged(
296 conference, mUnmodifiableConferenceableConnections);
297 }
298 });
Ihab Awad50e35062014-09-30 09:17:03 -0700299 }
300 }
301
Santos Cordonb804f8d2015-05-12 12:09:47 -0700302 /** @hide */
Andrew Lee011728f2015-04-23 15:47:06 -0700303 void setDisconnected(final DisconnectCause disconnectCause) {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700304 if (mState != Connection.STATE_DISCONNECTED) {
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700305 mDisconnectCause = disconnectCause;
Ihab Awadb8e85c72014-08-23 20:34:57 -0700306 setState(Connection.STATE_DISCONNECTED);
Andrew Lee011728f2015-04-23 15:47:06 -0700307 for (CallbackRecord<Callback> record : mCallbackRecords) {
308 final RemoteConference conference = this;
309 final Callback callback = record.getCallback();
310 record.getHandler().post(new Runnable() {
311 @Override
312 public void run() {
313 callback.onDisconnected(conference, disconnectCause);
314 }
315 });
Ihab Awadb8e85c72014-08-23 20:34:57 -0700316 }
317 }
318 }
319
Santos Cordon6b7f9552015-05-27 17:21:45 -0700320 /** @hide */
Tyler Gunndee56a82016-03-23 16:06:34 -0700321 void putExtras(final Bundle extras) {
Tyler Gunn2282bb92016-10-17 15:48:19 -0700322 if (extras == null) {
323 return;
324 }
Tyler Gunndee56a82016-03-23 16:06:34 -0700325 if (mExtras == null) {
326 mExtras = new Bundle();
327 }
328 mExtras.putAll(extras);
329
330 notifyExtrasChanged();
331 }
332
333 /** @hide */
334 void removeExtras(List<String> keys) {
335 if (mExtras == null || keys == null || keys.isEmpty()) {
336 return;
337 }
338 for (String key : keys) {
339 mExtras.remove(key);
340 }
341
342 notifyExtrasChanged();
343 }
344
345 private void notifyExtrasChanged() {
Santos Cordon6b7f9552015-05-27 17:21:45 -0700346 for (CallbackRecord<Callback> record : mCallbackRecords) {
347 final RemoteConference conference = this;
348 final Callback callback = record.getCallback();
349 record.getHandler().post(new Runnable() {
350 @Override
351 public void run() {
Tyler Gunndee56a82016-03-23 16:06:34 -0700352 callback.onExtrasChanged(conference, mExtras);
Santos Cordon6b7f9552015-05-27 17:21:45 -0700353 }
354 });
355 }
356 }
357
Santos Cordonb804f8d2015-05-12 12:09:47 -0700358 /**
359 * Returns the list of {@link RemoteConnection}s contained in this conference.
360 *
361 * @return A list of child connections.
362 */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700363 public final List<RemoteConnection> getConnections() {
364 return mUnmodifiableChildConnections;
365 }
366
Santos Cordonb804f8d2015-05-12 12:09:47 -0700367 /**
368 * Gets the state of the conference call. See {@link Connection} for valid values.
369 *
370 * @return A constant representing the state the conference call is currently in.
371 */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700372 public final int getState() {
373 return mState;
374 }
375
Santos Cordonb804f8d2015-05-12 12:09:47 -0700376 /**
377 * Returns the capabilities of the conference. See {@code CAPABILITY_*} constants in class
378 * {@link Connection} for valid values.
379 *
380 * @return A bitmask of the capabilities of the conference call.
381 */
Ihab Awad5c9c86e2014-11-12 13:41:16 -0800382 public final int getConnectionCapabilities() {
383 return mConnectionCapabilities;
Ihab Awadb8e85c72014-08-23 20:34:57 -0700384 }
385
Santos Cordonb804f8d2015-05-12 12:09:47 -0700386 /**
Tyler Gunn720c6642016-03-22 09:02:47 -0700387 * Returns the properties of the conference. See {@code PROPERTY_*} constants in class
388 * {@link Connection} for valid values.
389 *
390 * @return A bitmask of the properties of the conference call.
391 */
392 public final int getConnectionProperties() {
393 return mConnectionProperties;
394 }
395
396 /**
Santos Cordon6b7f9552015-05-27 17:21:45 -0700397 * Obtain the extras associated with this {@code RemoteConnection}.
398 *
399 * @return The extras for this connection.
400 */
401 public final Bundle getExtras() {
402 return mExtras;
403 }
404
405 /**
Santos Cordonb804f8d2015-05-12 12:09:47 -0700406 * Disconnects the conference call as well as the child {@link RemoteConnection}s.
407 */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700408 public void disconnect() {
409 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700410 mConnectionService.disconnect(mId, null /*Session.Info*/);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700411 } catch (RemoteException e) {
412 }
413 }
414
Santos Cordonb804f8d2015-05-12 12:09:47 -0700415 /**
416 * Removes the specified {@link RemoteConnection} from the conference. This causes the
417 * {@link RemoteConnection} to become a standalone connection. This is a no-op if the
418 * {@link RemoteConnection} does not belong to this conference.
419 *
420 * @param connection The remote-connection to remove.
421 */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700422 public void separate(RemoteConnection connection) {
423 if (mChildConnections.contains(connection)) {
424 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700425 mConnectionService.splitFromConference(connection.getId(), null /*Session.Info*/);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700426 } catch (RemoteException e) {
427 }
428 }
429 }
430
Santos Cordonb804f8d2015-05-12 12:09:47 -0700431 /**
432 * Merges all {@link RemoteConnection}s of this conference into a single call. This should be
433 * invoked only if the conference contains the capability
434 * {@link Connection#CAPABILITY_MERGE_CONFERENCE}, otherwise it is a no-op. The presence of said
435 * capability indicates that the connections of this conference, despite being part of the
436 * same conference object, are yet to have their audio streams merged; this is a common pattern
437 * for CDMA conference calls, but the capability is not used for GSM and SIP conference calls.
438 * Invoking this method will cause the unmerged child connections to merge their audio
439 * streams.
440 */
mike dooley95ea5762014-09-25 14:49:21 -0700441 public void merge() {
442 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700443 mConnectionService.mergeConference(mId, null /*Session.Info*/);
mike dooley95ea5762014-09-25 14:49:21 -0700444 } catch (RemoteException e) {
445 }
446 }
447
Santos Cordonb804f8d2015-05-12 12:09:47 -0700448 /**
449 * Swaps the active audio stream between the conference's child {@link RemoteConnection}s.
450 * This should be invoked only if the conference contains the capability
451 * {@link Connection#CAPABILITY_SWAP_CONFERENCE}, otherwise it is a no-op. This is only used by
452 * {@link ConnectionService}s that create conferences for connections that do not yet have
453 * their audio streams merged; this is a common pattern for CDMA conference calls, but the
454 * capability is not used for GSM and SIP conference calls. Invoking this method will change the
455 * active audio stream to a different child connection.
456 */
mike dooley95ea5762014-09-25 14:49:21 -0700457 public void swap() {
458 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700459 mConnectionService.swapConference(mId, null /*Session.Info*/);
mike dooley95ea5762014-09-25 14:49:21 -0700460 } catch (RemoteException e) {
461 }
462 }
463
Santos Cordonb804f8d2015-05-12 12:09:47 -0700464 /**
465 * Puts the conference on hold.
466 */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700467 public void hold() {
468 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700469 mConnectionService.hold(mId, null /*Session.Info*/);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700470 } catch (RemoteException e) {
471 }
472 }
473
Santos Cordonb804f8d2015-05-12 12:09:47 -0700474 /**
475 * Unholds the conference call.
476 */
Ihab Awadb8e85c72014-08-23 20:34:57 -0700477 public void unhold() {
478 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700479 mConnectionService.unhold(mId, null /*Session.Info*/);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700480 } catch (RemoteException e) {
481 }
482 }
483
Santos Cordonb804f8d2015-05-12 12:09:47 -0700484 /**
485 * Returns the {@link DisconnectCause} for the conference if it is in the state
486 * {@link Connection#STATE_DISCONNECTED}. If the conference is not disconnected, this will
487 * return null.
488 *
489 * @return The disconnect cause.
490 */
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700491 public DisconnectCause getDisconnectCause() {
Ihab Awadb8e85c72014-08-23 20:34:57 -0700492 return mDisconnectCause;
493 }
494
Santos Cordonb804f8d2015-05-12 12:09:47 -0700495 /**
496 * Requests that the conference start playing the specified DTMF tone.
497 *
498 * @param digit The digit for which to play a DTMF tone.
499 */
Yorke Lee58bacc52014-09-16 10:43:06 -0700500 public void playDtmfTone(char digit) {
501 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700502 mConnectionService.playDtmfTone(mId, digit, null /*Session.Info*/);
Yorke Lee58bacc52014-09-16 10:43:06 -0700503 } catch (RemoteException e) {
504 }
505 }
506
Santos Cordonb804f8d2015-05-12 12:09:47 -0700507 /**
508 * Stops the most recent request to play a DTMF tone.
509 *
510 * @see #playDtmfTone
511 */
Yorke Lee58bacc52014-09-16 10:43:06 -0700512 public void stopDtmfTone() {
513 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700514 mConnectionService.stopDtmfTone(mId, null /*Session.Info*/);
Yorke Lee58bacc52014-09-16 10:43:06 -0700515 } catch (RemoteException e) {
516 }
517 }
518
Santos Cordonb804f8d2015-05-12 12:09:47 -0700519 /**
520 * Request to change the conference's audio routing to the specified state. The specified state
521 * can include audio routing (Bluetooth, Speaker, etc) and muting state.
522 *
523 * @see android.telecom.AudioState
Yorke Lee4af59352015-05-13 14:14:54 -0700524 * @deprecated Use {@link #setCallAudioState(CallAudioState)} instead.
525 * @hide
Santos Cordonb804f8d2015-05-12 12:09:47 -0700526 */
Yorke Lee4af59352015-05-13 14:14:54 -0700527 @SystemApi
528 @Deprecated
Yorke Lee58bacc52014-09-16 10:43:06 -0700529 public void setAudioState(AudioState state) {
Yorke Lee4af59352015-05-13 14:14:54 -0700530 setCallAudioState(new CallAudioState(state));
531 }
532
533 /**
534 * Request to change the conference's audio routing to the specified state. The specified state
535 * can include audio routing (Bluetooth, Speaker, etc) and muting state.
536 */
537 public void setCallAudioState(CallAudioState state) {
Yorke Lee58bacc52014-09-16 10:43:06 -0700538 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700539 mConnectionService.onCallAudioStateChanged(mId, state, null /*Session.Info*/);
Yorke Lee58bacc52014-09-16 10:43:06 -0700540 } catch (RemoteException e) {
541 }
542 }
543
Yorke Lee4af59352015-05-13 14:14:54 -0700544
Santos Cordonb804f8d2015-05-12 12:09:47 -0700545 /**
546 * Returns a list of independent connections that can me merged with this conference.
547 *
548 * @return A list of conferenceable connections.
549 */
Ihab Awad50e35062014-09-30 09:17:03 -0700550 public List<RemoteConnection> getConferenceableConnections() {
551 return mUnmodifiableConferenceableConnections;
552 }
553
Santos Cordonb804f8d2015-05-12 12:09:47 -0700554 /**
555 * Register a callback through which to receive state updates for this conference.
556 *
557 * @param callback The callback to notify of state changes.
558 */
Andrew Lee100e2932014-09-08 15:34:24 -0700559 public final void registerCallback(Callback callback) {
Andrew Lee011728f2015-04-23 15:47:06 -0700560 registerCallback(callback, new Handler());
561 }
562
Santos Cordonb804f8d2015-05-12 12:09:47 -0700563 /**
564 * Registers a callback through which to receive state updates for this conference.
565 * Callbacks will be notified using the specified handler, if provided.
566 *
567 * @param callback The callback to notify of state changes.
568 * @param handler The handler on which to execute the callbacks.
569 */
Andrew Lee011728f2015-04-23 15:47:06 -0700570 public final void registerCallback(Callback callback, Handler handler) {
571 unregisterCallback(callback);
572 if (callback != null && handler != null) {
573 mCallbackRecords.add(new CallbackRecord(callback, handler));
574 }
Ihab Awadb8e85c72014-08-23 20:34:57 -0700575 }
576
Santos Cordonb804f8d2015-05-12 12:09:47 -0700577 /**
578 * Unregisters a previously registered callback.
579 *
580 * @see #registerCallback
581 *
582 * @param callback The callback to unregister.
583 */
Andrew Lee100e2932014-09-08 15:34:24 -0700584 public final void unregisterCallback(Callback callback) {
Andrew Lee011728f2015-04-23 15:47:06 -0700585 if (callback != null) {
586 for (CallbackRecord<Callback> record : mCallbackRecords) {
587 if (record.getCallback() == callback) {
588 mCallbackRecords.remove(record);
589 break;
590 }
591 }
592 }
Ihab Awadb8e85c72014-08-23 20:34:57 -0700593 }
Grace Jia9a09c672020-08-04 12:52:09 -0700594
595 /**
596 * Create a {@link RemoteConference} represents a failure, and which will
597 * be in {@link Connection#STATE_DISCONNECTED}.
598 *
599 * @param disconnectCause The disconnect cause.
600 * @return a failed {@link RemoteConference}
601 * @hide
602 */
603 public static RemoteConference failure(DisconnectCause disconnectCause) {
604 return new RemoteConference(disconnectCause);
605 }
Ihab Awadb8e85c72014-08-23 20:34:57 -0700606}