blob: 261246818f1d3156ae34f451703b3f802244fa65 [file] [log] [blame]
Santos Cordon8f3fd302014-01-27 08:46:21 -08001/*
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;
Santos Cordon8f3fd302014-01-27 08:46:21 -080018
Hall Liua98f58b52017-11-07 17:59:28 -080019import android.bluetooth.BluetoothDevice;
Hall Liu6dfa2492019-10-01 17:20:39 -070020import android.net.Uri;
Tyler Gunn876dbfb2016-03-14 15:18:07 -070021import android.os.Bundle;
Sailesh Nepalab5d2822014-03-08 18:01:06 -080022import android.os.RemoteException;
23
Tyler Gunnef9f6f92014-09-12 22:16:17 -070024import com.android.internal.telecom.IInCallAdapter;
Sailesh Nepalab5d2822014-03-08 18:01:06 -080025
Tyler Gunndee56a82016-03-23 16:06:34 -070026import java.util.List;
27
Santos Cordon8f3fd302014-01-27 08:46:21 -080028/**
Sailesh Nepalab5d2822014-03-08 18:01:06 -080029 * Receives commands from {@link InCallService} implementations which should be executed by
Tyler Gunnef9f6f92014-09-12 22:16:17 -070030 * Telecom. When Telecom binds to a {@link InCallService}, an instance of this class is given to
Santos Cordon8f3fd302014-01-27 08:46:21 -080031 * the in-call service through which it can manipulate live (active, dialing, ringing) calls. When
Ihab Awade63fadb2014-07-09 21:52:04 -070032 * the in-call service is notified of new calls, it can use the
Santos Cordon8f3fd302014-01-27 08:46:21 -080033 * given call IDs to execute commands such as {@link #answerCall} for incoming calls or
34 * {@link #disconnectCall} for active calls the user would like to end. Some commands are only
35 * appropriate for calls in certain states; please consult each method for such limitations.
Ihab Awadb19a0bc2014-08-07 19:46:01 -070036 * <p>
37 * The adapter will stop functioning when there are no more calls.
38 *
Hall Liu95d55872017-01-25 17:12:49 -080039 * @hide
Santos Cordon8f3fd302014-01-27 08:46:21 -080040 */
Sailesh Nepalab5d2822014-03-08 18:01:06 -080041public final class InCallAdapter {
42 private final IInCallAdapter mAdapter;
43
44 /**
45 * {@hide}
46 */
47 public InCallAdapter(IInCallAdapter adapter) {
48 mAdapter = adapter;
49 }
50
Santos Cordon8f3fd302014-01-27 08:46:21 -080051 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -070052 * Instructs Telecom to answer the specified call.
Santos Cordon8f3fd302014-01-27 08:46:21 -080053 *
54 * @param callId The identifier of the call to answer.
Andrew Lee8da4c3c2014-07-16 10:11:42 -070055 * @param videoState The video state in which to answer the call.
Santos Cordon8f3fd302014-01-27 08:46:21 -080056 */
Andrew Lee8da4c3c2014-07-16 10:11:42 -070057 public void answerCall(String callId, int videoState) {
Sailesh Nepalab5d2822014-03-08 18:01:06 -080058 try {
Andrew Lee8da4c3c2014-07-16 10:11:42 -070059 mAdapter.answerCall(callId, videoState);
Sailesh Nepalab5d2822014-03-08 18:01:06 -080060 } catch (RemoteException e) {
61 }
62 }
Santos Cordon8f3fd302014-01-27 08:46:21 -080063
64 /**
Pooja Jaind34698d2017-12-28 14:15:31 +053065 * Instructs Telecom to deflect the specified call.
66 *
67 * @param callId The identifier of the call to deflect.
68 * @param address The address to deflect.
69 */
70 public void deflectCall(String callId, Uri address) {
71 try {
72 mAdapter.deflectCall(callId, address);
73 } catch (RemoteException e) {
74 }
75 }
76
77 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -070078 * Instructs Telecom to reject the specified call.
Santos Cordon8f3fd302014-01-27 08:46:21 -080079 *
80 * @param callId The identifier of the call to reject.
Ihab Awadc0677542014-06-10 13:29:47 -070081 * @param rejectWithMessage Whether to reject with a text message.
82 * @param textMessage An optional text message with which to respond.
Santos Cordon8f3fd302014-01-27 08:46:21 -080083 */
Ihab Awadc0677542014-06-10 13:29:47 -070084 public void rejectCall(String callId, boolean rejectWithMessage, String textMessage) {
Sailesh Nepalab5d2822014-03-08 18:01:06 -080085 try {
Ihab Awadc0677542014-06-10 13:29:47 -070086 mAdapter.rejectCall(callId, rejectWithMessage, textMessage);
Sailesh Nepalab5d2822014-03-08 18:01:06 -080087 } catch (RemoteException e) {
88 }
89 }
Santos Cordon8f3fd302014-01-27 08:46:21 -080090
91 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -070092 * Instructs Telecom to disconnect the specified call.
Santos Cordon8f3fd302014-01-27 08:46:21 -080093 *
94 * @param callId The identifier of the call to disconnect.
95 */
Sailesh Nepalab5d2822014-03-08 18:01:06 -080096 public void disconnectCall(String callId) {
97 try {
98 mAdapter.disconnectCall(callId);
99 } catch (RemoteException e) {
100 }
101 }
Yorke Lee81ccaaa2014-03-12 18:33:19 -0700102
103 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700104 * Instructs Telecom to put the specified call on hold.
Yorke Lee81ccaaa2014-03-12 18:33:19 -0700105 *
106 * @param callId The identifier of the call to put on hold.
107 */
108 public void holdCall(String callId) {
109 try {
110 mAdapter.holdCall(callId);
111 } catch (RemoteException e) {
112 }
113 }
114
115 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700116 * Instructs Telecom to release the specified call from hold.
Yorke Lee81ccaaa2014-03-12 18:33:19 -0700117 *
118 * @param callId The identifier of the call to release from hold.
119 */
120 public void unholdCall(String callId) {
121 try {
122 mAdapter.unholdCall(callId);
123 } catch (RemoteException e) {
124 }
125 }
Sailesh Nepal4cff3922014-03-19 10:15:37 -0700126
127 /**
128 * Mute the microphone.
129 *
130 * @param shouldMute True if the microphone should be muted.
131 */
132 public void mute(boolean shouldMute) {
133 try {
134 mAdapter.mute(shouldMute);
135 } catch (RemoteException e) {
136 }
137 }
138
139 /**
Yorke Lee4af59352015-05-13 14:14:54 -0700140 * Sets the audio route (speaker, bluetooth, etc...). See {@link CallAudioState}.
Sailesh Nepal4cff3922014-03-19 10:15:37 -0700141 *
142 * @param route The audio route to use.
143 */
144 public void setAudioRoute(int route) {
145 try {
Hall Liua98f58b52017-11-07 17:59:28 -0800146 mAdapter.setAudioRoute(route, null);
147 } catch (RemoteException e) {
148 }
149 }
150
151 /**
Hall Liu6dfa2492019-10-01 17:20:39 -0700152 * @see Call#enterBackgroundAudioProcessing()
153 */
154 public void enterBackgroundAudioProcessing(String callId) {
155 try {
156 mAdapter.enterBackgroundAudioProcessing(callId);
157 } catch (RemoteException e) {
158 }
159 }
160
161 /**
162 * @see Call#exitBackgroundAudioProcessing(boolean)
163 */
164 public void exitBackgroundAudioProcessing(String callId, boolean shouldRing) {
165 try {
166 mAdapter.exitBackgroundAudioProcessing(callId, shouldRing);
167 } catch (RemoteException e) {
168 }
169 }
170
171 /**
Hall Liua98f58b52017-11-07 17:59:28 -0800172 * Request audio routing to a specific bluetooth device. Calling this method may result in
173 * the device routing audio to a different bluetooth device than the one specified. A list of
174 * available devices can be obtained via {@link CallAudioState#getSupportedBluetoothDevices()}
175 *
176 * @param bluetoothAddress The address of the bluetooth device to connect to, as returned by
177 * {@link BluetoothDevice#getAddress()}, or {@code null} if no device is preferred.
178 */
179 public void requestBluetoothAudio(String bluetoothAddress) {
180 try {
181 mAdapter.setAudioRoute(CallAudioState.ROUTE_BLUETOOTH, bluetoothAddress);
Sailesh Nepal4cff3922014-03-19 10:15:37 -0700182 } catch (RemoteException e) {
183 }
184 }
Ihab Awad2f236642014-03-10 15:33:45 -0700185
186 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700187 * Instructs Telecom to play a dual-tone multi-frequency signaling (DTMF) tone in a call.
Ihab Awad2f236642014-03-10 15:33:45 -0700188 *
189 * Any other currently playing DTMF tone in the specified call is immediately stopped.
190 *
191 * @param callId The unique ID of the call in which the tone will be played.
192 * @param digit A character representing the DTMF digit for which to play the tone. This
193 * value must be one of {@code '0'} through {@code '9'}, {@code '*'} or {@code '#'}.
194 */
195 public void playDtmfTone(String callId, char digit) {
196 try {
197 mAdapter.playDtmfTone(callId, digit);
198 } catch (RemoteException e) {
199 }
200 }
201
202 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700203 * Instructs Telecom to stop any dual-tone multi-frequency signaling (DTMF) tone currently
Ihab Awad2f236642014-03-10 15:33:45 -0700204 * playing.
205 *
206 * DTMF tones are played by calling {@link #playDtmfTone(String,char)}. If no DTMF tone is
207 * currently playing, this method will do nothing.
208 *
209 * @param callId The unique ID of the call in which any currently playing tone will be stopped.
210 */
211 public void stopDtmfTone(String callId) {
212 try {
213 mAdapter.stopDtmfTone(callId);
214 } catch (RemoteException e) {
215 }
216 }
217
218 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700219 * Instructs Telecom to continue playing a post-dial DTMF string.
Ihab Awad2f236642014-03-10 15:33:45 -0700220 *
221 * A post-dial DTMF string is a string of digits entered after a phone number, when dialed,
222 * that are immediately sent as DTMF tones to the recipient as soon as the connection is made.
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700223 * While these tones are playing, Telecom will notify the {@link InCallService} that the call
Ihab Awade63fadb2014-07-09 21:52:04 -0700224 * is in the post dial state.
Ihab Awad2f236642014-03-10 15:33:45 -0700225 *
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700226 * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_PAUSE} symbol, Telecom
Evan Charlton8acdbb82014-04-01 13:50:07 -0700227 * will temporarily pause playing the tones for a pre-defined period of time.
Ihab Awad2f236642014-03-10 15:33:45 -0700228 *
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700229 * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_WAIT} symbol, Telecom
Evan Charlton8acdbb82014-04-01 13:50:07 -0700230 * will pause playing the tones and notify the {@link InCallService} that the call is in the
Ihab Awade63fadb2014-07-09 21:52:04 -0700231 * post dial wait state. When the user decides to continue the postdial sequence, the
232 * {@link InCallService} should invoke the {@link #postDialContinue(String,boolean)} method.
Ihab Awad2f236642014-03-10 15:33:45 -0700233 *
234 * @param callId The unique ID of the call for which postdial string playing should continue.
Evan Charlton6dea4ac2014-06-03 14:07:13 -0700235 * @param proceed Whether or not to continue with the post-dial sequence.
Ihab Awad2f236642014-03-10 15:33:45 -0700236 */
Evan Charlton6dea4ac2014-06-03 14:07:13 -0700237 public void postDialContinue(String callId, boolean proceed) {
Ihab Awad2f236642014-03-10 15:33:45 -0700238 try {
Evan Charlton6dea4ac2014-06-03 14:07:13 -0700239 mAdapter.postDialContinue(callId, proceed);
Ihab Awad2f236642014-03-10 15:33:45 -0700240 } catch (RemoteException e) {
241 }
242 }
Sailesh Nepalb632e5b2014-04-03 12:54:33 -0700243
244 /**
Nancy Chen36c62f32014-10-21 18:36:39 -0700245 * Instructs Telecom to add a PhoneAccountHandle to the specified call.
Nancy Chen5da0fd52014-07-08 14:16:17 -0700246 *
Nancy Chen36c62f32014-10-21 18:36:39 -0700247 * @param callId The identifier of the call.
248 * @param accountHandle The PhoneAccountHandle through which to place the call.
249 * @param setDefault {@code True} if this account should be set as the default for calls.
Nancy Chen5da0fd52014-07-08 14:16:17 -0700250 */
Nancy Chen36c62f32014-10-21 18:36:39 -0700251 public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle,
252 boolean setDefault) {
Nancy Chen5da0fd52014-07-08 14:16:17 -0700253 try {
Nancy Chen36c62f32014-10-21 18:36:39 -0700254 mAdapter.phoneAccountSelected(callId, accountHandle, setDefault);
Nancy Chen5da0fd52014-07-08 14:16:17 -0700255 } catch (RemoteException e) {
256 }
257 }
258
259 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700260 * Instructs Telecom to conference the specified call.
Santos Cordon980acb92014-05-31 10:31:19 -0700261 *
262 * @param callId The unique ID of the call.
Santos Cordon980acb92014-05-31 10:31:19 -0700263 * @hide
264 */
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700265 public void conference(String callId, String otherCallId) {
Santos Cordon980acb92014-05-31 10:31:19 -0700266 try {
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700267 mAdapter.conference(callId, otherCallId);
Santos Cordon980acb92014-05-31 10:31:19 -0700268 } catch (RemoteException ignored) {
269 }
270 }
271
272 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700273 * Instructs Telecom to split the specified call from any conference call with which it may be
Santos Cordon980acb92014-05-31 10:31:19 -0700274 * connected.
275 *
276 * @param callId The unique ID of the call.
277 * @hide
278 */
Santos Cordonb6939982014-06-04 20:20:58 -0700279 public void splitFromConference(String callId) {
Santos Cordon980acb92014-05-31 10:31:19 -0700280 try {
281 mAdapter.splitFromConference(callId);
282 } catch (RemoteException ignored) {
283 }
284 }
Sailesh Nepal61203862014-07-11 14:50:13 -0700285
286 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700287 * Instructs Telecom to merge child calls of the specified conference call.
Santos Cordona4868042014-09-04 17:39:22 -0700288 */
289 public void mergeConference(String callId) {
290 try {
291 mAdapter.mergeConference(callId);
292 } catch (RemoteException ignored) {
293 }
294 }
295
296 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700297 * Instructs Telecom to swap the child calls of the specified conference call.
Santos Cordona4868042014-09-04 17:39:22 -0700298 */
299 public void swapConference(String callId) {
300 try {
301 mAdapter.swapConference(callId);
302 } catch (RemoteException ignored) {
303 }
304 }
305
306 /**
Tyler Gunn876dbfb2016-03-14 15:18:07 -0700307 * Instructs Telecom to pull an external call to the local device.
308 *
309 * @param callId The callId to pull.
310 */
311 public void pullExternalCall(String callId) {
312 try {
313 mAdapter.pullExternalCall(callId);
314 } catch (RemoteException ignored) {
315 }
316 }
317
318 /**
319 * Intructs Telecom to send a call event.
320 *
321 * @param callId The callId to send the event for.
322 * @param event The event.
Sanket Padawef6a9e5b2018-01-05 14:26:16 -0800323 * @param targetSdkVer Target sdk version of the app calling this api
Tyler Gunn876dbfb2016-03-14 15:18:07 -0700324 * @param extras Extras associated with the event.
325 */
Sanket Padawef6a9e5b2018-01-05 14:26:16 -0800326 public void sendCallEvent(String callId, String event, int targetSdkVer, Bundle extras) {
Tyler Gunn876dbfb2016-03-14 15:18:07 -0700327 try {
Sanket Padawef6a9e5b2018-01-05 14:26:16 -0800328 mAdapter.sendCallEvent(callId, event, targetSdkVer, extras);
Tyler Gunn876dbfb2016-03-14 15:18:07 -0700329 } catch (RemoteException ignored) {
330 }
331 }
332
333 /**
Tyler Gunndee56a82016-03-23 16:06:34 -0700334 * Intructs Telecom to add extras to a call.
335 *
336 * @param callId The callId to add the extras to.
337 * @param extras The extras.
338 */
339 public void putExtras(String callId, Bundle extras) {
340 try {
341 mAdapter.putExtras(callId, extras);
342 } catch (RemoteException ignored) {
343 }
344 }
345
346 /**
347 * Intructs Telecom to add an extra to a call.
348 *
349 * @param callId The callId to add the extras to.
350 * @param key The extra key.
351 * @param value The extra value.
352 */
353 public void putExtra(String callId, String key, boolean value) {
354 try {
355 Bundle bundle = new Bundle();
356 bundle.putBoolean(key, value);
357 mAdapter.putExtras(callId, bundle);
358 } catch (RemoteException ignored) {
359 }
360 }
361
362 /**
363 * Intructs Telecom to add an extra to a call.
364 *
365 * @param callId The callId to add the extras to.
366 * @param key The extra key.
367 * @param value The extra value.
368 */
369 public void putExtra(String callId, String key, int value) {
370 try {
371 Bundle bundle = new Bundle();
372 bundle.putInt(key, value);
373 mAdapter.putExtras(callId, bundle);
374 } catch (RemoteException ignored) {
375 }
376 }
377
378 /**
379 * Intructs Telecom to add an extra to a call.
380 *
381 * @param callId The callId to add the extras to.
382 * @param key The extra key.
383 * @param value The extra value.
384 */
385 public void putExtra(String callId, String key, String value) {
386 try {
387 Bundle bundle = new Bundle();
388 bundle.putString(key, value);
389 mAdapter.putExtras(callId, bundle);
390 } catch (RemoteException ignored) {
391 }
392 }
393
394 /**
395 * Intructs Telecom to remove extras from a call.
396 * @param callId The callId to remove the extras from.
397 * @param keys The extra keys to remove.
398 */
399 public void removeExtras(String callId, List<String> keys) {
400 try {
401 mAdapter.removeExtras(callId, keys);
402 } catch (RemoteException ignored) {
403 }
404 }
405
406 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700407 * Instructs Telecom to turn the proximity sensor on.
Yorke Lee0d6ea712014-07-28 14:39:23 -0700408 */
409 public void turnProximitySensorOn() {
410 try {
411 mAdapter.turnOnProximitySensor();
412 } catch (RemoteException ignored) {
413 }
414 }
415
416 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700417 * Instructs Telecom to turn the proximity sensor off.
Yorke Lee0d6ea712014-07-28 14:39:23 -0700418 *
419 * @param screenOnImmediately If true, the screen will be turned on immediately if it was
420 * previously off. Otherwise, the screen will only be turned on after the proximity sensor
421 * is no longer triggered.
422 */
423 public void turnProximitySensorOff(boolean screenOnImmediately) {
424 try {
425 mAdapter.turnOffProximitySensor(screenOnImmediately);
426 } catch (RemoteException ignored) {
427 }
428 }
Hall Liu95d55872017-01-25 17:12:49 -0800429
430 /**
431 * Sends an RTT upgrade request to the remote end of the connection.
432 */
Hall Liu57006aa2017-02-06 10:49:48 -0800433 public void sendRttRequest(String callId) {
Hall Liu95d55872017-01-25 17:12:49 -0800434 try {
Hall Liu57006aa2017-02-06 10:49:48 -0800435 mAdapter.sendRttRequest(callId);
Hall Liu95d55872017-01-25 17:12:49 -0800436 } catch (RemoteException ignored) {
437 }
438 }
439
440 /**
441 * Responds to an RTT upgrade request initiated from the remote end.
442 *
443 * @param id the ID of the request as specified by Telecom
444 * @param accept Whether the request should be accepted.
445 */
Hall Liu57006aa2017-02-06 10:49:48 -0800446 public void respondToRttRequest(String callId, int id, boolean accept) {
Hall Liu95d55872017-01-25 17:12:49 -0800447 try {
Hall Liu57006aa2017-02-06 10:49:48 -0800448 mAdapter.respondToRttRequest(callId, id, accept);
Hall Liu95d55872017-01-25 17:12:49 -0800449 } catch (RemoteException ignored) {
450 }
451 }
452
453 /**
454 * Instructs Telecom to shut down the RTT communication channel.
455 */
Hall Liu57006aa2017-02-06 10:49:48 -0800456 public void stopRtt(String callId) {
Hall Liu95d55872017-01-25 17:12:49 -0800457 try {
Hall Liu57006aa2017-02-06 10:49:48 -0800458 mAdapter.stopRtt(callId);
Hall Liu95d55872017-01-25 17:12:49 -0800459 } catch (RemoteException ignored) {
460 }
461 }
462
463 /**
464 * Sets the RTT audio mode.
465 * @param mode the desired RTT audio mode
466 */
Hall Liu57006aa2017-02-06 10:49:48 -0800467 public void setRttMode(String callId, int mode) {
Hall Liu95d55872017-01-25 17:12:49 -0800468 try {
Hall Liu57006aa2017-02-06 10:49:48 -0800469 mAdapter.setRttMode(callId, mode);
Hall Liu95d55872017-01-25 17:12:49 -0800470 } catch (RemoteException ignored) {
471 }
472 }
Sanket Padawea8eddd42017-11-03 11:07:35 -0700473
474
475 /**
476 * Initiates a handover of this {@link Call} to the {@link ConnectionService} identified
477 * by destAcct.
478 * @param callId The callId of the Call which calls this function.
479 * @param destAcct ConnectionService to which the call should be handed over.
480 * @param videoState The video state desired after the handover.
481 * @param extras Extra information to be passed to ConnectionService
482 */
483 public void handoverTo(String callId, PhoneAccountHandle destAcct, int videoState,
484 Bundle extras) {
485 try {
486 mAdapter.handoverTo(callId, destAcct, videoState, extras);
487 } catch (RemoteException ignored) {
488 }
489 }
Santos Cordon8f3fd302014-01-27 08:46:21 -0800490}