1 /* 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 17 package android.telecom; 18 19 import android.net.Uri; 20 import android.bluetooth.BluetoothDevice; 21 import android.os.Bundle; 22 import android.os.RemoteException; 23 24 import com.android.internal.telecom.IInCallAdapter; 25 26 import java.util.List; 27 28 /** 29 * Receives commands from {@link InCallService} implementations which should be executed by 30 * Telecom. When Telecom binds to a {@link InCallService}, an instance of this class is given to 31 * the in-call service through which it can manipulate live (active, dialing, ringing) calls. When 32 * the in-call service is notified of new calls, it can use the 33 * 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. 36 * <p> 37 * The adapter will stop functioning when there are no more calls. 38 * 39 * @hide 40 */ 41 public final class InCallAdapter { 42 private final IInCallAdapter mAdapter; 43 44 /** 45 * {@hide} 46 */ InCallAdapter(IInCallAdapter adapter)47 public InCallAdapter(IInCallAdapter adapter) { 48 mAdapter = adapter; 49 } 50 51 /** 52 * Instructs Telecom to answer the specified call. 53 * 54 * @param callId The identifier of the call to answer. 55 * @param videoState The video state in which to answer the call. 56 */ answerCall(String callId, int videoState)57 public void answerCall(String callId, int videoState) { 58 try { 59 mAdapter.answerCall(callId, videoState); 60 } catch (RemoteException e) { 61 } 62 } 63 64 /** 65 * 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 */ deflectCall(String callId, Uri address)70 public void deflectCall(String callId, Uri address) { 71 try { 72 mAdapter.deflectCall(callId, address); 73 } catch (RemoteException e) { 74 } 75 } 76 77 /** 78 * Instructs Telecom to reject the specified call. 79 * 80 * @param callId The identifier of the call to reject. 81 * @param rejectWithMessage Whether to reject with a text message. 82 * @param textMessage An optional text message with which to respond. 83 */ rejectCall(String callId, boolean rejectWithMessage, String textMessage)84 public void rejectCall(String callId, boolean rejectWithMessage, String textMessage) { 85 try { 86 mAdapter.rejectCall(callId, rejectWithMessage, textMessage); 87 } catch (RemoteException e) { 88 } 89 } 90 91 /** 92 * Instructs Telecom to disconnect the specified call. 93 * 94 * @param callId The identifier of the call to disconnect. 95 */ disconnectCall(String callId)96 public void disconnectCall(String callId) { 97 try { 98 mAdapter.disconnectCall(callId); 99 } catch (RemoteException e) { 100 } 101 } 102 103 /** 104 * Instructs Telecom to put the specified call on hold. 105 * 106 * @param callId The identifier of the call to put on hold. 107 */ holdCall(String callId)108 public void holdCall(String callId) { 109 try { 110 mAdapter.holdCall(callId); 111 } catch (RemoteException e) { 112 } 113 } 114 115 /** 116 * Instructs Telecom to release the specified call from hold. 117 * 118 * @param callId The identifier of the call to release from hold. 119 */ unholdCall(String callId)120 public void unholdCall(String callId) { 121 try { 122 mAdapter.unholdCall(callId); 123 } catch (RemoteException e) { 124 } 125 } 126 127 /** 128 * Mute the microphone. 129 * 130 * @param shouldMute True if the microphone should be muted. 131 */ mute(boolean shouldMute)132 public void mute(boolean shouldMute) { 133 try { 134 mAdapter.mute(shouldMute); 135 } catch (RemoteException e) { 136 } 137 } 138 139 /** 140 * Sets the audio route (speaker, bluetooth, etc...). See {@link CallAudioState}. 141 * 142 * @param route The audio route to use. 143 */ setAudioRoute(int route)144 public void setAudioRoute(int route) { 145 try { 146 mAdapter.setAudioRoute(route, null); 147 } catch (RemoteException e) { 148 } 149 } 150 151 /** 152 * Request audio routing to a specific bluetooth device. Calling this method may result in 153 * the device routing audio to a different bluetooth device than the one specified. A list of 154 * available devices can be obtained via {@link CallAudioState#getSupportedBluetoothDevices()} 155 * 156 * @param bluetoothAddress The address of the bluetooth device to connect to, as returned by 157 * {@link BluetoothDevice#getAddress()}, or {@code null} if no device is preferred. 158 */ requestBluetoothAudio(String bluetoothAddress)159 public void requestBluetoothAudio(String bluetoothAddress) { 160 try { 161 mAdapter.setAudioRoute(CallAudioState.ROUTE_BLUETOOTH, bluetoothAddress); 162 } catch (RemoteException e) { 163 } 164 } 165 166 /** 167 * Instructs Telecom to play a dual-tone multi-frequency signaling (DTMF) tone in a call. 168 * 169 * Any other currently playing DTMF tone in the specified call is immediately stopped. 170 * 171 * @param callId The unique ID of the call in which the tone will be played. 172 * @param digit A character representing the DTMF digit for which to play the tone. This 173 * value must be one of {@code '0'} through {@code '9'}, {@code '*'} or {@code '#'}. 174 */ playDtmfTone(String callId, char digit)175 public void playDtmfTone(String callId, char digit) { 176 try { 177 mAdapter.playDtmfTone(callId, digit); 178 } catch (RemoteException e) { 179 } 180 } 181 182 /** 183 * Instructs Telecom to stop any dual-tone multi-frequency signaling (DTMF) tone currently 184 * playing. 185 * 186 * DTMF tones are played by calling {@link #playDtmfTone(String,char)}. If no DTMF tone is 187 * currently playing, this method will do nothing. 188 * 189 * @param callId The unique ID of the call in which any currently playing tone will be stopped. 190 */ stopDtmfTone(String callId)191 public void stopDtmfTone(String callId) { 192 try { 193 mAdapter.stopDtmfTone(callId); 194 } catch (RemoteException e) { 195 } 196 } 197 198 /** 199 * Instructs Telecom to continue playing a post-dial DTMF string. 200 * 201 * A post-dial DTMF string is a string of digits entered after a phone number, when dialed, 202 * that are immediately sent as DTMF tones to the recipient as soon as the connection is made. 203 * While these tones are playing, Telecom will notify the {@link InCallService} that the call 204 * is in the post dial state. 205 * 206 * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_PAUSE} symbol, Telecom 207 * will temporarily pause playing the tones for a pre-defined period of time. 208 * 209 * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_WAIT} symbol, Telecom 210 * will pause playing the tones and notify the {@link InCallService} that the call is in the 211 * post dial wait state. When the user decides to continue the postdial sequence, the 212 * {@link InCallService} should invoke the {@link #postDialContinue(String,boolean)} method. 213 * 214 * @param callId The unique ID of the call for which postdial string playing should continue. 215 * @param proceed Whether or not to continue with the post-dial sequence. 216 */ postDialContinue(String callId, boolean proceed)217 public void postDialContinue(String callId, boolean proceed) { 218 try { 219 mAdapter.postDialContinue(callId, proceed); 220 } catch (RemoteException e) { 221 } 222 } 223 224 /** 225 * Instructs Telecom to add a PhoneAccountHandle to the specified call. 226 * 227 * @param callId The identifier of the call. 228 * @param accountHandle The PhoneAccountHandle through which to place the call. 229 * @param setDefault {@code True} if this account should be set as the default for calls. 230 */ phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, boolean setDefault)231 public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, 232 boolean setDefault) { 233 try { 234 mAdapter.phoneAccountSelected(callId, accountHandle, setDefault); 235 } catch (RemoteException e) { 236 } 237 } 238 239 /** 240 * Instructs Telecom to conference the specified call. 241 * 242 * @param callId The unique ID of the call. 243 * @hide 244 */ conference(String callId, String otherCallId)245 public void conference(String callId, String otherCallId) { 246 try { 247 mAdapter.conference(callId, otherCallId); 248 } catch (RemoteException ignored) { 249 } 250 } 251 252 /** 253 * Instructs Telecom to split the specified call from any conference call with which it may be 254 * connected. 255 * 256 * @param callId The unique ID of the call. 257 * @hide 258 */ splitFromConference(String callId)259 public void splitFromConference(String callId) { 260 try { 261 mAdapter.splitFromConference(callId); 262 } catch (RemoteException ignored) { 263 } 264 } 265 266 /** 267 * Instructs Telecom to merge child calls of the specified conference call. 268 */ mergeConference(String callId)269 public void mergeConference(String callId) { 270 try { 271 mAdapter.mergeConference(callId); 272 } catch (RemoteException ignored) { 273 } 274 } 275 276 /** 277 * Instructs Telecom to swap the child calls of the specified conference call. 278 */ swapConference(String callId)279 public void swapConference(String callId) { 280 try { 281 mAdapter.swapConference(callId); 282 } catch (RemoteException ignored) { 283 } 284 } 285 286 /** 287 * Instructs Telecom to pull an external call to the local device. 288 * 289 * @param callId The callId to pull. 290 */ pullExternalCall(String callId)291 public void pullExternalCall(String callId) { 292 try { 293 mAdapter.pullExternalCall(callId); 294 } catch (RemoteException ignored) { 295 } 296 } 297 298 /** 299 * Intructs Telecom to send a call event. 300 * 301 * @param callId The callId to send the event for. 302 * @param event The event. 303 * @param targetSdkVer Target sdk version of the app calling this api 304 * @param extras Extras associated with the event. 305 */ sendCallEvent(String callId, String event, int targetSdkVer, Bundle extras)306 public void sendCallEvent(String callId, String event, int targetSdkVer, Bundle extras) { 307 try { 308 mAdapter.sendCallEvent(callId, event, targetSdkVer, extras); 309 } catch (RemoteException ignored) { 310 } 311 } 312 313 /** 314 * Intructs Telecom to add extras to a call. 315 * 316 * @param callId The callId to add the extras to. 317 * @param extras The extras. 318 */ putExtras(String callId, Bundle extras)319 public void putExtras(String callId, Bundle extras) { 320 try { 321 mAdapter.putExtras(callId, extras); 322 } catch (RemoteException ignored) { 323 } 324 } 325 326 /** 327 * Intructs Telecom to add an extra to a call. 328 * 329 * @param callId The callId to add the extras to. 330 * @param key The extra key. 331 * @param value The extra value. 332 */ putExtra(String callId, String key, boolean value)333 public void putExtra(String callId, String key, boolean value) { 334 try { 335 Bundle bundle = new Bundle(); 336 bundle.putBoolean(key, value); 337 mAdapter.putExtras(callId, bundle); 338 } catch (RemoteException ignored) { 339 } 340 } 341 342 /** 343 * Intructs Telecom to add an extra to a call. 344 * 345 * @param callId The callId to add the extras to. 346 * @param key The extra key. 347 * @param value The extra value. 348 */ putExtra(String callId, String key, int value)349 public void putExtra(String callId, String key, int value) { 350 try { 351 Bundle bundle = new Bundle(); 352 bundle.putInt(key, value); 353 mAdapter.putExtras(callId, bundle); 354 } catch (RemoteException ignored) { 355 } 356 } 357 358 /** 359 * Intructs Telecom to add an extra to a call. 360 * 361 * @param callId The callId to add the extras to. 362 * @param key The extra key. 363 * @param value The extra value. 364 */ putExtra(String callId, String key, String value)365 public void putExtra(String callId, String key, String value) { 366 try { 367 Bundle bundle = new Bundle(); 368 bundle.putString(key, value); 369 mAdapter.putExtras(callId, bundle); 370 } catch (RemoteException ignored) { 371 } 372 } 373 374 /** 375 * Intructs Telecom to remove extras from a call. 376 * @param callId The callId to remove the extras from. 377 * @param keys The extra keys to remove. 378 */ removeExtras(String callId, List<String> keys)379 public void removeExtras(String callId, List<String> keys) { 380 try { 381 mAdapter.removeExtras(callId, keys); 382 } catch (RemoteException ignored) { 383 } 384 } 385 386 /** 387 * Instructs Telecom to turn the proximity sensor on. 388 */ turnProximitySensorOn()389 public void turnProximitySensorOn() { 390 try { 391 mAdapter.turnOnProximitySensor(); 392 } catch (RemoteException ignored) { 393 } 394 } 395 396 /** 397 * Instructs Telecom to turn the proximity sensor off. 398 * 399 * @param screenOnImmediately If true, the screen will be turned on immediately if it was 400 * previously off. Otherwise, the screen will only be turned on after the proximity sensor 401 * is no longer triggered. 402 */ turnProximitySensorOff(boolean screenOnImmediately)403 public void turnProximitySensorOff(boolean screenOnImmediately) { 404 try { 405 mAdapter.turnOffProximitySensor(screenOnImmediately); 406 } catch (RemoteException ignored) { 407 } 408 } 409 410 /** 411 * Sends an RTT upgrade request to the remote end of the connection. 412 */ sendRttRequest(String callId)413 public void sendRttRequest(String callId) { 414 try { 415 mAdapter.sendRttRequest(callId); 416 } catch (RemoteException ignored) { 417 } 418 } 419 420 /** 421 * Responds to an RTT upgrade request initiated from the remote end. 422 * 423 * @param id the ID of the request as specified by Telecom 424 * @param accept Whether the request should be accepted. 425 */ respondToRttRequest(String callId, int id, boolean accept)426 public void respondToRttRequest(String callId, int id, boolean accept) { 427 try { 428 mAdapter.respondToRttRequest(callId, id, accept); 429 } catch (RemoteException ignored) { 430 } 431 } 432 433 /** 434 * Instructs Telecom to shut down the RTT communication channel. 435 */ stopRtt(String callId)436 public void stopRtt(String callId) { 437 try { 438 mAdapter.stopRtt(callId); 439 } catch (RemoteException ignored) { 440 } 441 } 442 443 /** 444 * Sets the RTT audio mode. 445 * @param mode the desired RTT audio mode 446 */ setRttMode(String callId, int mode)447 public void setRttMode(String callId, int mode) { 448 try { 449 mAdapter.setRttMode(callId, mode); 450 } catch (RemoteException ignored) { 451 } 452 } 453 454 455 /** 456 * Initiates a handover of this {@link Call} to the {@link ConnectionService} identified 457 * by destAcct. 458 * @param callId The callId of the Call which calls this function. 459 * @param destAcct ConnectionService to which the call should be handed over. 460 * @param videoState The video state desired after the handover. 461 * @param extras Extra information to be passed to ConnectionService 462 */ handoverTo(String callId, PhoneAccountHandle destAcct, int videoState, Bundle extras)463 public void handoverTo(String callId, PhoneAccountHandle destAcct, int videoState, 464 Bundle extras) { 465 try { 466 mAdapter.handoverTo(callId, destAcct, videoState, extras); 467 } catch (RemoteException ignored) { 468 } 469 } 470 } 471