1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 15 package android.telecom; 16 17 import android.Manifest; 18 import android.annotation.RequiresPermission; 19 import android.annotation.SuppressAutoDoc; 20 import android.annotation.SuppressLint; 21 import android.annotation.SystemApi; 22 import android.annotation.SystemService; 23 import android.content.ComponentName; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.net.Uri; 27 import android.os.Build; 28 import android.os.Bundle; 29 import android.os.RemoteException; 30 import android.os.ServiceManager; 31 import android.telephony.TelephonyManager; 32 import android.text.TextUtils; 33 import android.util.Log; 34 35 import com.android.internal.telecom.ITelecomService; 36 37 import java.util.ArrayList; 38 import java.util.Collections; 39 import java.util.List; 40 41 /** 42 * Provides access to information about active calls and registration/call-management functionality. 43 * Apps can use methods in this class to determine the current call state. 44 * <p> 45 * Apps do not instantiate this class directly; instead, they retrieve a reference to an instance 46 * through {@link Context#getSystemService Context.getSystemService(Context.TELECOM_SERVICE)}. 47 * <p> 48 * Note that access to some telecom information is permission-protected. Your app cannot access the 49 * protected information or gain access to protected functionality unless it has the appropriate 50 * permissions declared in its manifest file. Where permissions apply, they are noted in the method 51 * descriptions. 52 */ 53 @SuppressAutoDoc 54 @SystemService(Context.TELECOM_SERVICE) 55 public class TelecomManager { 56 57 /** 58 * Activity action: Starts the UI for handing an incoming call. This intent starts the in-call 59 * UI by notifying the Telecom system that an incoming call exists for a specific call service 60 * (see {@link android.telecom.ConnectionService}). Telecom reads the Intent extras to find 61 * and bind to the appropriate {@link android.telecom.ConnectionService} which Telecom will 62 * ultimately use to control and get information about the call. 63 * <p> 64 * Input: get*Extra field {@link #EXTRA_PHONE_ACCOUNT_HANDLE} contains the component name of the 65 * {@link android.telecom.ConnectionService} that Telecom should bind to. Telecom will then 66 * ask the connection service for more information about the call prior to showing any UI. 67 * 68 * @deprecated Use {@link #addNewIncomingCall} instead. 69 */ 70 public static final String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL"; 71 72 /** 73 * Similar to {@link #ACTION_INCOMING_CALL}, but is used only by Telephony to add a new 74 * sim-initiated MO call for carrier testing. 75 * @deprecated Use {@link #addNewUnknownCall} instead. 76 * @hide 77 */ 78 public static final String ACTION_NEW_UNKNOWN_CALL = "android.telecom.action.NEW_UNKNOWN_CALL"; 79 80 /** 81 * An {@link android.content.Intent} action sent by the telecom framework to start a 82 * configuration dialog for a registered {@link PhoneAccount}. There is no default dialog 83 * and each app that registers a {@link PhoneAccount} should provide one if desired. 84 * <p> 85 * A user can access the list of enabled {@link android.telecom.PhoneAccount}s through the Phone 86 * app's settings menu. For each entry, the settings app will add a click action. When 87 * triggered, the click-action will start this intent along with the extra 88 * {@link #EXTRA_PHONE_ACCOUNT_HANDLE} to indicate the {@link PhoneAccount} to configure. If the 89 * {@link PhoneAccount} package does not register an {@link android.app.Activity} for this 90 * intent, then it will not be sent. 91 */ 92 public static final String ACTION_CONFIGURE_PHONE_ACCOUNT = 93 "android.telecom.action.CONFIGURE_PHONE_ACCOUNT"; 94 95 /** 96 * The {@link android.content.Intent} action used to show the call accessibility settings page. 97 */ 98 public static final String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = 99 "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS"; 100 101 /** 102 * The {@link android.content.Intent} action used to show the call settings page. 103 */ 104 public static final String ACTION_SHOW_CALL_SETTINGS = 105 "android.telecom.action.SHOW_CALL_SETTINGS"; 106 107 /** 108 * The {@link android.content.Intent} action used to show the respond via SMS settings page. 109 */ 110 public static final String ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS = 111 "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS"; 112 113 /** 114 * The {@link android.content.Intent} action used to show the settings page used to configure 115 * {@link PhoneAccount} preferences. 116 */ 117 public static final String ACTION_CHANGE_PHONE_ACCOUNTS = 118 "android.telecom.action.CHANGE_PHONE_ACCOUNTS"; 119 120 /** 121 * {@link android.content.Intent} action used indicate that a new phone account was just 122 * registered. 123 * <p> 124 * The Intent {@link Intent#getExtras() extras} will contain {@link #EXTRA_PHONE_ACCOUNT_HANDLE} 125 * to indicate which {@link PhoneAccount} was registered. 126 * <p> 127 * Will only be sent to the default dialer app (see {@link #getDefaultDialerPackage()}). 128 */ 129 public static final String ACTION_PHONE_ACCOUNT_REGISTERED = 130 "android.telecom.action.PHONE_ACCOUNT_REGISTERED"; 131 132 /** 133 * {@link android.content.Intent} action used indicate that a phone account was just 134 * unregistered. 135 * <p> 136 * The Intent {@link Intent#getExtras() extras} will contain {@link #EXTRA_PHONE_ACCOUNT_HANDLE} 137 * to indicate which {@link PhoneAccount} was unregistered. 138 * <p> 139 * Will only be sent to the default dialer app (see {@link #getDefaultDialerPackage()}). 140 */ 141 public static final String ACTION_PHONE_ACCOUNT_UNREGISTERED = 142 "android.telecom.action.PHONE_ACCOUNT_UNREGISTERED"; 143 144 /** 145 * Activity action: Shows a dialog asking the user whether or not they want to replace the 146 * current default Dialer with the one specified in 147 * {@link #EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME}. 148 * 149 * Usage example: 150 * <pre> 151 * Intent intent = new Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER); 152 * intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, 153 * getActivity().getPackageName()); 154 * startActivity(intent); 155 * </pre> 156 */ 157 public static final String ACTION_CHANGE_DEFAULT_DIALER = 158 "android.telecom.action.CHANGE_DEFAULT_DIALER"; 159 160 /** 161 * Broadcast intent action indicating that the current default dialer has changed. 162 * The string extra {@link #EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME} will contain the 163 * name of the package that the default dialer was changed to. 164 * 165 * @see #EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME 166 */ 167 public static final String ACTION_DEFAULT_DIALER_CHANGED = 168 "android.telecom.action.DEFAULT_DIALER_CHANGED"; 169 170 /** 171 * Extra value used to provide the package name for {@link #ACTION_CHANGE_DEFAULT_DIALER}. 172 */ 173 public static final String EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME = 174 "android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME"; 175 176 /** 177 * Optional extra for {@link android.content.Intent#ACTION_CALL} containing a boolean that 178 * determines whether the speakerphone should be automatically turned on for an outgoing call. 179 */ 180 public static final String EXTRA_START_CALL_WITH_SPEAKERPHONE = 181 "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE"; 182 183 /** 184 * Optional extra for {@link android.content.Intent#ACTION_CALL} containing an integer that 185 * determines the desired video state for an outgoing call. 186 * Valid options: 187 * {@link VideoProfile#STATE_AUDIO_ONLY}, 188 * {@link VideoProfile#STATE_BIDIRECTIONAL}, 189 * {@link VideoProfile#STATE_RX_ENABLED}, 190 * {@link VideoProfile#STATE_TX_ENABLED}. 191 */ 192 public static final String EXTRA_START_CALL_WITH_VIDEO_STATE = 193 "android.telecom.extra.START_CALL_WITH_VIDEO_STATE"; 194 195 /** 196 * Optional extra for {@link #addNewIncomingCall(PhoneAccountHandle, Bundle)} containing an 197 * integer that determines the requested video state for an incoming call. 198 * Valid options: 199 * {@link VideoProfile#STATE_AUDIO_ONLY}, 200 * {@link VideoProfile#STATE_BIDIRECTIONAL}, 201 * {@link VideoProfile#STATE_RX_ENABLED}, 202 * {@link VideoProfile#STATE_TX_ENABLED}. 203 */ 204 public static final String EXTRA_INCOMING_VIDEO_STATE = 205 "android.telecom.extra.INCOMING_VIDEO_STATE"; 206 207 /** 208 * The extra used with an {@link android.content.Intent#ACTION_CALL} and 209 * {@link android.content.Intent#ACTION_DIAL} {@code Intent} to specify a 210 * {@link PhoneAccountHandle} to use when making the call. 211 * <p class="note"> 212 * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}. 213 */ 214 public static final String EXTRA_PHONE_ACCOUNT_HANDLE = 215 "android.telecom.extra.PHONE_ACCOUNT_HANDLE"; 216 217 /** 218 * Optional extra for {@link android.content.Intent#ACTION_CALL} containing a string call 219 * subject which will be associated with an outgoing call. Should only be specified if the 220 * {@link PhoneAccount} supports the capability {@link PhoneAccount#CAPABILITY_CALL_SUBJECT}. 221 */ 222 public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; 223 224 /** 225 * The extra used by a {@link ConnectionService} to provide the handle of the caller that 226 * has initiated a new incoming call. 227 */ 228 public static final String EXTRA_INCOMING_CALL_ADDRESS = 229 "android.telecom.extra.INCOMING_CALL_ADDRESS"; 230 231 /** 232 * Optional extra for {@link #ACTION_INCOMING_CALL} containing a {@link Bundle} which contains 233 * metadata about the call. This {@link Bundle} will be returned to the 234 * {@link ConnectionService}. 235 */ 236 public static final String EXTRA_INCOMING_CALL_EXTRAS = 237 "android.telecom.extra.INCOMING_CALL_EXTRAS"; 238 239 /** 240 * Optional extra for {@link #ACTION_INCOMING_CALL} containing a boolean to indicate that the 241 * call has an externally generated ringer. Used by the HfpClientConnectionService when In Band 242 * Ringtone is enabled to prevent two ringers from being generated. 243 * @hide 244 */ 245 public static final String EXTRA_CALL_EXTERNAL_RINGER = 246 "android.telecom.extra.CALL_EXTERNAL_RINGER"; 247 248 /** 249 * Optional extra for {@link android.content.Intent#ACTION_CALL} and 250 * {@link android.content.Intent#ACTION_DIAL} {@code Intent} containing a {@link Bundle} 251 * which contains metadata about the call. This {@link Bundle} will be saved into 252 * {@code Call.Details} and passed to the {@link ConnectionService} when placing the call. 253 */ 254 public static final String EXTRA_OUTGOING_CALL_EXTRAS = 255 "android.telecom.extra.OUTGOING_CALL_EXTRAS"; 256 257 /** 258 * @hide 259 */ 260 public static final String EXTRA_UNKNOWN_CALL_HANDLE = 261 "android.telecom.extra.UNKNOWN_CALL_HANDLE"; 262 263 /** 264 * Optional extra for incoming and outgoing calls containing a long which specifies the time the 265 * call was created. This value is in milliseconds since boot. 266 * @hide 267 */ 268 public static final String EXTRA_CALL_CREATED_TIME_MILLIS = 269 "android.telecom.extra.CALL_CREATED_TIME_MILLIS"; 270 271 /** 272 * Optional extra for incoming and outgoing calls containing a long which specifies the time 273 * telecom began routing the call. This value is in milliseconds since boot. 274 * @hide 275 */ 276 public static final String EXTRA_CALL_TELECOM_ROUTING_START_TIME_MILLIS = 277 "android.telecom.extra.CALL_TELECOM_ROUTING_START_TIME_MILLIS"; 278 279 /** 280 * Optional extra for incoming and outgoing calls containing a long which specifies the time 281 * telecom finished routing the call. This value is in milliseconds since boot. 282 * @hide 283 */ 284 public static final String EXTRA_CALL_TELECOM_ROUTING_END_TIME_MILLIS = 285 "android.telecom.extra.CALL_TELECOM_ROUTING_END_TIME_MILLIS"; 286 287 /** 288 * Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED} 289 * containing the disconnect code. 290 */ 291 public static final String EXTRA_CALL_DISCONNECT_CAUSE = 292 "android.telecom.extra.CALL_DISCONNECT_CAUSE"; 293 294 /** 295 * Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED} 296 * containing the disconnect message. 297 */ 298 public static final String EXTRA_CALL_DISCONNECT_MESSAGE = 299 "android.telecom.extra.CALL_DISCONNECT_MESSAGE"; 300 301 /** 302 * Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED} 303 * containing the component name of the associated connection service. 304 * @hide 305 */ 306 @SystemApi 307 public static final String EXTRA_CONNECTION_SERVICE = 308 "android.telecom.extra.CONNECTION_SERVICE"; 309 310 /** 311 * Optional extra for communicating the call technology used by a 312 * {@link com.android.internal.telephony.Connection} to Telecom 313 * @hide 314 */ 315 public static final String EXTRA_CALL_TECHNOLOGY_TYPE = 316 "android.telecom.extra.CALL_TECHNOLOGY_TYPE"; 317 318 /** 319 * An optional {@link android.content.Intent#ACTION_CALL} intent extra denoting the 320 * package name of the app specifying an alternative gateway for the call. 321 * The value is a string. 322 * 323 * (The following comment corresponds to the all GATEWAY_* extras) 324 * An app which sends the {@link android.content.Intent#ACTION_CALL} intent can specify an 325 * alternative address to dial which is different from the one specified and displayed to 326 * the user. This alternative address is referred to as the gateway address. 327 */ 328 public static final String GATEWAY_PROVIDER_PACKAGE = 329 "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; 330 331 /** 332 * An optional {@link android.content.Intent#ACTION_CALL} intent extra corresponding to the 333 * original address to dial for the call. This is used when an alternative gateway address is 334 * provided to recall the original address. 335 * The value is a {@link android.net.Uri}. 336 * 337 * (See {@link #GATEWAY_PROVIDER_PACKAGE} for details) 338 */ 339 public static final String GATEWAY_ORIGINAL_ADDRESS = 340 "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; 341 342 /** 343 * The number which the party on the other side of the line will see (and use to return the 344 * call). 345 * <p> 346 * {@link ConnectionService}s which interact with {@link RemoteConnection}s should only populate 347 * this if the {@link android.telephony.TelephonyManager#getLine1Number()} value, as that is the 348 * user's expected caller ID. 349 */ 350 public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER"; 351 352 /** 353 * The number of milliseconds that Telecom should wait after disconnecting a call via the 354 * ACTION_NEW_OUTGOING_CALL broadcast, in order to wait for the app which cancelled the call 355 * to make a new one. 356 * @hide 357 */ 358 public static final String EXTRA_NEW_OUTGOING_CALL_CANCEL_TIMEOUT = 359 "android.telecom.extra.NEW_OUTGOING_CALL_CANCEL_TIMEOUT"; 360 361 /** 362 * Boolean extra specified to indicate that the intention of adding a call is to handover an 363 * existing call from the user's device to a different {@link PhoneAccount}. 364 * <p> 365 * Used when calling {@link #addNewIncomingCall(PhoneAccountHandle, Bundle)} 366 * to indicate to Telecom that the purpose of adding a new incoming call is to handover an 367 * existing call from the user's device to a different {@link PhoneAccount}. This occurs on 368 * the receiving side of a handover. 369 * <p> 370 * Used when Telecom calls 371 * {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} 372 * to indicate that the purpose of Telecom requesting a new outgoing connection it to request 373 * a handover to this {@link ConnectionService} from an ongoing call on the user's device. This 374 * occurs on the initiating side of a handover. 375 * <p> 376 * The phone number of the call used by Telecom to determine which call should be handed over. 377 * @hide 378 */ 379 public static final String EXTRA_IS_HANDOVER = "android.telecom.extra.IS_HANDOVER"; 380 381 /** 382 * When {@code true} indicates that a request to create a new connection is for the purpose of 383 * a handover. Note: This is used with the 384 * {@link android.telecom.Call#handoverTo(PhoneAccountHandle, int, Bundle)} API as part of the 385 * internal communication mechanism with the {@link android.telecom.ConnectionService}. It is 386 * not the same as the legacy {@link #EXTRA_IS_HANDOVER} extra. 387 * @hide 388 */ 389 public static final String EXTRA_IS_HANDOVER_CONNECTION = 390 "android.telecom.extra.IS_HANDOVER_CONNECTION"; 391 392 /** 393 * Parcelable extra used with {@link #EXTRA_IS_HANDOVER} to indicate the source 394 * {@link PhoneAccountHandle} when initiating a handover which {@link ConnectionService} 395 * the handover is from. 396 * @hide 397 */ 398 public static final String EXTRA_HANDOVER_FROM_PHONE_ACCOUNT = 399 "android.telecom.extra.HANDOVER_FROM_PHONE_ACCOUNT"; 400 401 /** 402 * Extra key specified in the {@link ConnectionRequest#getExtras()} when Telecom calls 403 * {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} 404 * to inform the {@link ConnectionService} what the initial {@link CallAudioState} of the 405 * {@link Connection} will be. 406 * @hide 407 */ 408 public static final String EXTRA_CALL_AUDIO_STATE = "android.telecom.extra.CALL_AUDIO_STATE"; 409 410 /** 411 * A boolean extra, which when set on the {@link Intent#ACTION_CALL} intent or on the bundle 412 * passed into {@link #placeCall(Uri, Bundle)}, indicates that the call should be initiated with 413 * an RTT session open. See {@link android.telecom.Call.RttCall} for more information on RTT. 414 */ 415 public static final String EXTRA_START_CALL_WITH_RTT = 416 "android.telecom.extra.START_CALL_WITH_RTT"; 417 418 /** 419 * A boolean meta-data value indicating whether an {@link InCallService} implements an 420 * in-call user interface. Dialer implementations (see {@link #getDefaultDialerPackage()}) which 421 * would also like to replace the in-call interface should set this meta-data to {@code true} in 422 * the manifest registration of their {@link InCallService}. 423 */ 424 public static final String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI"; 425 426 /** 427 * A boolean meta-data value indicating whether an {@link InCallService} implements an 428 * in-call user interface to be used while the device is in car-mode (see 429 * {@link android.content.res.Configuration.UI_MODE_TYPE_CAR}). 430 * 431 * @hide 432 */ 433 public static final String METADATA_IN_CALL_SERVICE_CAR_MODE_UI = 434 "android.telecom.IN_CALL_SERVICE_CAR_MODE_UI"; 435 436 /** 437 * A boolean meta-data value indicating whether an {@link InCallService} implements ringing. 438 * Dialer implementations (see {@link #getDefaultDialerPackage()}) which would also like to 439 * override the system provided ringing should set this meta-data to {@code true} in the 440 * manifest registration of their {@link InCallService}. 441 */ 442 public static final String METADATA_IN_CALL_SERVICE_RINGING = 443 "android.telecom.IN_CALL_SERVICE_RINGING"; 444 445 /** 446 * A boolean meta-data value indicating whether an {@link InCallService} wants to be informed of 447 * calls which have the {@link Call.Details#PROPERTY_IS_EXTERNAL_CALL} property. An external 448 * call is one which a {@link ConnectionService} knows about, but is not connected to directly. 449 * Dialer implementations (see {@link #getDefaultDialerPackage()}) which would like to be 450 * informed of external calls should set this meta-data to {@code true} in the manifest 451 * registration of their {@link InCallService}. By default, the {@link InCallService} will NOT 452 * be informed of external calls. 453 */ 454 public static final String METADATA_INCLUDE_EXTERNAL_CALLS = 455 "android.telecom.INCLUDE_EXTERNAL_CALLS"; 456 457 /** 458 * A boolean meta-data value indicating whether an {@link InCallService} wants to be informed of 459 * calls which have the {@link Call.Details#PROPERTY_SELF_MANAGED} property. A self-managed 460 * call is one which originates from a self-managed {@link ConnectionService} which has chosen 461 * to implement its own call user interface. An {@link InCallService} implementation which 462 * would like to be informed of external calls should set this meta-data to {@code true} in the 463 * manifest registration of their {@link InCallService}. By default, the {@link InCallService} 464 * will NOT be informed about self-managed calls. 465 * <p> 466 * An {@link InCallService} which receives self-managed calls is free to view and control the 467 * state of calls in the self-managed {@link ConnectionService}. An example use-case is 468 * exposing these calls to an automotive device via its companion app. 469 * <p> 470 * This meta-data can only be set for an {@link InCallService} which also sets 471 * {@link #METADATA_IN_CALL_SERVICE_UI}. Only the default phone/dialer app, or a car-mode 472 * {@link InCallService} can see self-managed calls. 473 * <p> 474 * See also {@link Connection#PROPERTY_SELF_MANAGED}. 475 */ 476 public static final String METADATA_INCLUDE_SELF_MANAGED_CALLS = 477 "android.telecom.INCLUDE_SELF_MANAGED_CALLS"; 478 479 /** 480 * The dual tone multi-frequency signaling character sent to indicate the dialing system should 481 * pause for a predefined period. 482 */ 483 public static final char DTMF_CHARACTER_PAUSE = ','; 484 485 /** 486 * The dual-tone multi-frequency signaling character sent to indicate the dialing system should 487 * wait for user confirmation before proceeding. 488 */ 489 public static final char DTMF_CHARACTER_WAIT = ';'; 490 491 /** 492 * TTY (teletypewriter) mode is off. 493 * 494 * @hide 495 */ 496 public static final int TTY_MODE_OFF = 0; 497 498 /** 499 * TTY (teletypewriter) mode is on. The speaker is off and the microphone is muted. The user 500 * will communicate with the remote party by sending and receiving text messages. 501 * 502 * @hide 503 */ 504 public static final int TTY_MODE_FULL = 1; 505 506 /** 507 * TTY (teletypewriter) mode is in hearing carryover mode (HCO). The microphone is muted but the 508 * speaker is on. The user will communicate with the remote party by sending text messages and 509 * hearing an audible reply. 510 * 511 * @hide 512 */ 513 public static final int TTY_MODE_HCO = 2; 514 515 /** 516 * TTY (teletypewriter) mode is in voice carryover mode (VCO). The speaker is off but the 517 * microphone is still on. User will communicate with the remote party by speaking and receiving 518 * text message replies. 519 * 520 * @hide 521 */ 522 public static final int TTY_MODE_VCO = 3; 523 524 /** 525 * Broadcast intent action indicating that the current TTY mode has changed. An intent extra 526 * provides this state as an int. 527 * 528 * @see #EXTRA_CURRENT_TTY_MODE 529 * @hide 530 */ 531 public static final String ACTION_CURRENT_TTY_MODE_CHANGED = 532 "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; 533 534 /** 535 * The lookup key for an int that indicates the current TTY mode. 536 * Valid modes are: 537 * - {@link #TTY_MODE_OFF} 538 * - {@link #TTY_MODE_FULL} 539 * - {@link #TTY_MODE_HCO} 540 * - {@link #TTY_MODE_VCO} 541 * 542 * @hide 543 */ 544 public static final String EXTRA_CURRENT_TTY_MODE = 545 "android.telecom.intent.extra.CURRENT_TTY_MODE"; 546 547 /** 548 * Broadcast intent action indicating that the TTY preferred operating mode has changed. An 549 * intent extra provides the new mode as an int. 550 * 551 * @see #EXTRA_TTY_PREFERRED_MODE 552 * @hide 553 */ 554 public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = 555 "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; 556 557 /** 558 * The lookup key for an int that indicates preferred TTY mode. Valid modes are: - 559 * {@link #TTY_MODE_OFF} - {@link #TTY_MODE_FULL} - {@link #TTY_MODE_HCO} - 560 * {@link #TTY_MODE_VCO} 561 * 562 * @hide 563 */ 564 public static final String EXTRA_TTY_PREFERRED_MODE = 565 "android.telecom.intent.extra.TTY_PREFERRED"; 566 567 /** 568 * Broadcast intent action for letting custom component know to show the missed call 569 * notification. If no custom component exists then this is sent to the default dialer which 570 * should post a missed-call notification. 571 */ 572 public static final String ACTION_SHOW_MISSED_CALLS_NOTIFICATION = 573 "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION"; 574 575 /** 576 * The number of calls associated with the notification. If the number is zero then the missed 577 * call notification should be dismissed. 578 */ 579 public static final String EXTRA_NOTIFICATION_COUNT = 580 "android.telecom.extra.NOTIFICATION_COUNT"; 581 582 /** 583 * The number associated with the missed calls. This number is only relevant 584 * when EXTRA_NOTIFICATION_COUNT is 1. 585 */ 586 public static final String EXTRA_NOTIFICATION_PHONE_NUMBER = 587 "android.telecom.extra.NOTIFICATION_PHONE_NUMBER"; 588 589 /** 590 * The intent to clear missed calls. 591 * @hide 592 */ 593 @SystemApi 594 public static final String EXTRA_CLEAR_MISSED_CALLS_INTENT = 595 "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT"; 596 597 /** 598 * The intent to call back a missed call. 599 * @hide 600 */ 601 @SystemApi 602 public static final String EXTRA_CALL_BACK_INTENT = 603 "android.telecom.extra.CALL_BACK_INTENT"; 604 605 /** 606 * The dialer activity responsible for placing emergency calls from, for example, a locked 607 * keyguard. 608 * @hide 609 */ 610 public static final ComponentName EMERGENCY_DIALER_COMPONENT = 611 ComponentName.createRelative("com.android.phone", ".EmergencyDialer"); 612 613 /** 614 * The boolean indicated by this extra controls whether or not a call is eligible to undergo 615 * assisted dialing. This extra is stored under {@link #EXTRA_OUTGOING_CALL_EXTRAS}. 616 * @hide 617 */ 618 public static final String EXTRA_USE_ASSISTED_DIALING = 619 "android.telecom.extra.USE_ASSISTED_DIALING"; 620 621 /** 622 * The following 4 constants define how properties such as phone numbers and names are 623 * displayed to the user. 624 */ 625 626 /** 627 * Indicates that the address or number of a call is allowed to be displayed for caller ID. 628 */ 629 public static final int PRESENTATION_ALLOWED = 1; 630 631 /** 632 * Indicates that the address or number of a call is blocked by the other party. 633 */ 634 public static final int PRESENTATION_RESTRICTED = 2; 635 636 /** 637 * Indicates that the address or number of a call is not specified or known by the carrier. 638 */ 639 public static final int PRESENTATION_UNKNOWN = 3; 640 641 /** 642 * Indicates that the address or number of a call belongs to a pay phone. 643 */ 644 public static final int PRESENTATION_PAYPHONE = 4; 645 646 private static final String TAG = "TelecomManager"; 647 648 private final Context mContext; 649 650 private final ITelecomService mTelecomServiceOverride; 651 652 /** 653 * @hide 654 */ from(Context context)655 public static TelecomManager from(Context context) { 656 return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); 657 } 658 659 /** 660 * @hide 661 */ TelecomManager(Context context)662 public TelecomManager(Context context) { 663 this(context, null); 664 } 665 666 /** 667 * @hide 668 */ TelecomManager(Context context, ITelecomService telecomServiceImpl)669 public TelecomManager(Context context, ITelecomService telecomServiceImpl) { 670 Context appContext = context.getApplicationContext(); 671 if (appContext != null) { 672 mContext = appContext; 673 } else { 674 mContext = context; 675 } 676 mTelecomServiceOverride = telecomServiceImpl; 677 } 678 679 /** 680 * Return the {@link PhoneAccount} which will be used to place outgoing calls to addresses with 681 * the specified {@code uriScheme}. This {@link PhoneAccount} will always be a member of the 682 * list which is returned from invoking {@link #getCallCapablePhoneAccounts()}. The specific 683 * account returned depends on the following priorities: 684 * <ul> 685 * <li> If the user-selected default {@link PhoneAccount} supports the specified scheme, it will 686 * be returned. 687 * </li> 688 * <li> If there exists only one {@link PhoneAccount} that supports the specified scheme, it 689 * will be returned. 690 * </li> 691 * </ul> 692 * <p> 693 * If no {@link PhoneAccount} fits the criteria above, this method will return {@code null}. 694 * 695 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 696 * 697 * @param uriScheme The URI scheme. 698 * @return The {@link PhoneAccountHandle} corresponding to the account to be used. 699 */ 700 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) getDefaultOutgoingPhoneAccount(String uriScheme)701 public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme) { 702 try { 703 if (isServiceConnected()) { 704 return getTelecomService().getDefaultOutgoingPhoneAccount(uriScheme, 705 mContext.getOpPackageName()); 706 } 707 } catch (RemoteException e) { 708 Log.e(TAG, "Error calling ITelecomService#getDefaultOutgoingPhoneAccount", e); 709 } 710 return null; 711 } 712 713 /** 714 * Return the {@link PhoneAccount} which is the user-chosen default for making outgoing phone 715 * calls. This {@code PhoneAccount} will always be a member of the list which is returned from 716 * calling {@link #getCallCapablePhoneAccounts()} 717 * <p> 718 * Apps must be prepared for this method to return {@code null}, indicating that there currently 719 * exists no user-chosen default {@code PhoneAccount}. 720 * 721 * @return The user outgoing phone account selected by the user. 722 * @hide 723 */ getUserSelectedOutgoingPhoneAccount()724 public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() { 725 try { 726 if (isServiceConnected()) { 727 return getTelecomService().getUserSelectedOutgoingPhoneAccount(); 728 } 729 } catch (RemoteException e) { 730 Log.e(TAG, "Error calling ITelecomService#getUserSelectedOutgoingPhoneAccount", e); 731 } 732 return null; 733 } 734 735 /** 736 * Sets the user-chosen default for making outgoing phone calls. 737 * @hide 738 */ setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle accountHandle)739 public void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle accountHandle) { 740 try { 741 if (isServiceConnected()) { 742 getTelecomService().setUserSelectedOutgoingPhoneAccount(accountHandle); 743 } 744 } catch (RemoteException e) { 745 Log.e(TAG, "Error calling ITelecomService#setUserSelectedOutgoingPhoneAccount"); 746 } 747 } 748 749 /** 750 * Returns the current SIM call manager. Apps must be prepared for this method to return 751 * {@code null}, indicating that there currently exists no user-chosen default 752 * {@code PhoneAccount}. 753 * 754 * @return The phone account handle of the current sim call manager. 755 */ getSimCallManager()756 public PhoneAccountHandle getSimCallManager() { 757 try { 758 if (isServiceConnected()) { 759 return getTelecomService().getSimCallManager(); 760 } 761 } catch (RemoteException e) { 762 Log.e(TAG, "Error calling ITelecomService#getSimCallManager"); 763 } 764 return null; 765 } 766 767 /** 768 * Returns the current SIM call manager for the specified user. Apps must be prepared for this 769 * method to return {@code null}, indicating that there currently exists no user-chosen default 770 * {@code PhoneAccount}. 771 * 772 * @return The phone account handle of the current sim call manager. 773 * 774 * @hide 775 */ getSimCallManager(int userId)776 public PhoneAccountHandle getSimCallManager(int userId) { 777 try { 778 if (isServiceConnected()) { 779 return getTelecomService().getSimCallManagerForUser(userId); 780 } 781 } catch (RemoteException e) { 782 Log.e(TAG, "Error calling ITelecomService#getSimCallManagerForUser"); 783 } 784 return null; 785 } 786 787 /** 788 * Returns the current connection manager. Apps must be prepared for this method to return 789 * {@code null}, indicating that there currently exists no user-chosen default 790 * {@code PhoneAccount}. 791 * 792 * @return The phone account handle of the current connection manager. 793 * @hide 794 */ 795 @SystemApi getConnectionManager()796 public PhoneAccountHandle getConnectionManager() { 797 return getSimCallManager(); 798 } 799 800 /** 801 * Returns a list of the {@link PhoneAccountHandle}s which can be used to make and receive phone 802 * calls which support the specified URI scheme. 803 * <P> 804 * For example, invoking with {@code "tel"} will find all {@link PhoneAccountHandle}s which 805 * support telephone calls (e.g. URIs such as {@code tel:555-555-1212}). Invoking with 806 * {@code "sip"} will find all {@link PhoneAccountHandle}s which support SIP calls (e.g. URIs 807 * such as {@code sip:example@sipexample.com}). 808 * 809 * @param uriScheme The URI scheme. 810 * @return A list of {@code PhoneAccountHandle} objects supporting the URI scheme. 811 * @hide 812 */ 813 @SystemApi 814 @RequiresPermission(anyOf = { 815 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 816 android.Manifest.permission.READ_PHONE_STATE 817 }) getPhoneAccountsSupportingScheme(String uriScheme)818 public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme) { 819 try { 820 if (isServiceConnected()) { 821 return getTelecomService().getPhoneAccountsSupportingScheme(uriScheme, 822 mContext.getOpPackageName()); 823 } 824 } catch (RemoteException e) { 825 Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsSupportingScheme", e); 826 } 827 return new ArrayList<>(); 828 } 829 830 831 /** 832 * Returns a list of {@link PhoneAccountHandle}s which can be used to make and receive phone 833 * calls. The returned list includes only those accounts which have been explicitly enabled 834 * by the user. 835 * 836 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 837 * 838 * @see #EXTRA_PHONE_ACCOUNT_HANDLE 839 * @return A list of {@code PhoneAccountHandle} objects. 840 */ 841 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) getCallCapablePhoneAccounts()842 public List<PhoneAccountHandle> getCallCapablePhoneAccounts() { 843 return getCallCapablePhoneAccounts(false); 844 } 845 846 /** 847 * Returns a list of {@link PhoneAccountHandle}s for self-managed {@link ConnectionService}s. 848 * <p> 849 * Self-Managed {@link ConnectionService}s have a {@link PhoneAccount} with 850 * {@link PhoneAccount#CAPABILITY_SELF_MANAGED}. 851 * <p> 852 * Requires permission {@link android.Manifest.permission#READ_PHONE_STATE}, or that the caller 853 * is the default dialer app. 854 * <p> 855 * A {@link SecurityException} will be thrown if a called is not the default dialer, or lacks 856 * the {@link android.Manifest.permission#READ_PHONE_STATE} permission. 857 * 858 * @return A list of {@code PhoneAccountHandle} objects. 859 */ 860 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) getSelfManagedPhoneAccounts()861 public List<PhoneAccountHandle> getSelfManagedPhoneAccounts() { 862 try { 863 if (isServiceConnected()) { 864 return getTelecomService().getSelfManagedPhoneAccounts(mContext.getOpPackageName()); 865 } 866 } catch (RemoteException e) { 867 Log.e(TAG, "Error calling ITelecomService#getSelfManagedPhoneAccounts()", e); 868 } 869 return new ArrayList<>(); 870 } 871 872 /** 873 * Returns a list of {@link PhoneAccountHandle}s including those which have not been enabled 874 * by the user. 875 * 876 * @return A list of {@code PhoneAccountHandle} objects. 877 * @hide 878 */ getCallCapablePhoneAccounts(boolean includeDisabledAccounts)879 public List<PhoneAccountHandle> getCallCapablePhoneAccounts(boolean includeDisabledAccounts) { 880 try { 881 if (isServiceConnected()) { 882 return getTelecomService().getCallCapablePhoneAccounts( 883 includeDisabledAccounts, mContext.getOpPackageName()); 884 } 885 } catch (RemoteException e) { 886 Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts(" + 887 includeDisabledAccounts + ")", e); 888 } 889 return new ArrayList<>(); 890 } 891 892 /** 893 * Returns a list of all {@link PhoneAccount}s registered for the calling package. 894 * 895 * @return A list of {@code PhoneAccountHandle} objects. 896 * @hide 897 */ 898 @SystemApi 899 @SuppressLint("Doclava125") getPhoneAccountsForPackage()900 public List<PhoneAccountHandle> getPhoneAccountsForPackage() { 901 try { 902 if (isServiceConnected()) { 903 return getTelecomService().getPhoneAccountsForPackage(mContext.getPackageName()); 904 } 905 } catch (RemoteException e) { 906 Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsForPackage", e); 907 } 908 return null; 909 } 910 911 /** 912 * Return the {@link PhoneAccount} for a specified {@link PhoneAccountHandle}. Object includes 913 * resources which can be used in a user interface. 914 * 915 * @param account The {@link PhoneAccountHandle}. 916 * @return The {@link PhoneAccount} object. 917 */ getPhoneAccount(PhoneAccountHandle account)918 public PhoneAccount getPhoneAccount(PhoneAccountHandle account) { 919 try { 920 if (isServiceConnected()) { 921 return getTelecomService().getPhoneAccount(account); 922 } 923 } catch (RemoteException e) { 924 Log.e(TAG, "Error calling ITelecomService#getPhoneAccount", e); 925 } 926 return null; 927 } 928 929 /** 930 * Returns a count of all {@link PhoneAccount}s. 931 * 932 * @return The count of {@link PhoneAccount}s. 933 * @hide 934 */ 935 @SystemApi getAllPhoneAccountsCount()936 public int getAllPhoneAccountsCount() { 937 try { 938 if (isServiceConnected()) { 939 return getTelecomService().getAllPhoneAccountsCount(); 940 } 941 } catch (RemoteException e) { 942 Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountsCount", e); 943 } 944 return 0; 945 } 946 947 /** 948 * Returns a list of all {@link PhoneAccount}s. 949 * 950 * @return All {@link PhoneAccount}s. 951 * @hide 952 */ 953 @SystemApi getAllPhoneAccounts()954 public List<PhoneAccount> getAllPhoneAccounts() { 955 try { 956 if (isServiceConnected()) { 957 return getTelecomService().getAllPhoneAccounts(); 958 } 959 } catch (RemoteException e) { 960 Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccounts", e); 961 } 962 return Collections.EMPTY_LIST; 963 } 964 965 /** 966 * Returns a list of all {@link PhoneAccountHandle}s. 967 * 968 * @return All {@link PhoneAccountHandle}s. 969 * @hide 970 */ 971 @SystemApi getAllPhoneAccountHandles()972 public List<PhoneAccountHandle> getAllPhoneAccountHandles() { 973 try { 974 if (isServiceConnected()) { 975 return getTelecomService().getAllPhoneAccountHandles(); 976 } 977 } catch (RemoteException e) { 978 Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountHandles", e); 979 } 980 return Collections.EMPTY_LIST; 981 } 982 983 /** 984 * Register a {@link PhoneAccount} for use by the system that will be stored in Device Encrypted 985 * storage. When registering {@link PhoneAccount}s, existing registrations will be overwritten 986 * if the {@link PhoneAccountHandle} matches that of a {@link PhoneAccount} which is already 987 * registered. Once registered, the {@link PhoneAccount} is listed to the user as an option 988 * when placing calls. The user may still need to enable the {@link PhoneAccount} within 989 * the phone app settings before the account is usable. 990 * <p> 991 * A {@link SecurityException} will be thrown if an app tries to register a 992 * {@link PhoneAccountHandle} where the package name specified within 993 * {@link PhoneAccountHandle#getComponentName()} does not match the package name of the app. 994 * 995 * @param account The complete {@link PhoneAccount}. 996 */ registerPhoneAccount(PhoneAccount account)997 public void registerPhoneAccount(PhoneAccount account) { 998 try { 999 if (isServiceConnected()) { 1000 getTelecomService().registerPhoneAccount(account); 1001 } 1002 } catch (RemoteException e) { 1003 Log.e(TAG, "Error calling ITelecomService#registerPhoneAccount", e); 1004 } 1005 } 1006 1007 /** 1008 * Remove a {@link PhoneAccount} registration from the system. 1009 * 1010 * @param accountHandle A {@link PhoneAccountHandle} for the {@link PhoneAccount} to unregister. 1011 */ unregisterPhoneAccount(PhoneAccountHandle accountHandle)1012 public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) { 1013 try { 1014 if (isServiceConnected()) { 1015 getTelecomService().unregisterPhoneAccount(accountHandle); 1016 } 1017 } catch (RemoteException e) { 1018 Log.e(TAG, "Error calling ITelecomService#unregisterPhoneAccount", e); 1019 } 1020 } 1021 1022 /** 1023 * Remove all Accounts that belong to the calling package from the system. 1024 * @hide 1025 */ 1026 @SystemApi 1027 @SuppressLint("Doclava125") clearPhoneAccounts()1028 public void clearPhoneAccounts() { 1029 clearAccounts(); 1030 } 1031 /** 1032 * Remove all Accounts that belong to the calling package from the system. 1033 * @deprecated Use {@link #clearPhoneAccounts()} instead. 1034 * @hide 1035 */ 1036 @SystemApi 1037 @SuppressLint("Doclava125") clearAccounts()1038 public void clearAccounts() { 1039 try { 1040 if (isServiceConnected()) { 1041 getTelecomService().clearAccounts(mContext.getPackageName()); 1042 } 1043 } catch (RemoteException e) { 1044 Log.e(TAG, "Error calling ITelecomService#clearAccounts", e); 1045 } 1046 } 1047 1048 /** 1049 * Remove all Accounts that belong to the specified package from the system. 1050 * @hide 1051 */ clearAccountsForPackage(String packageName)1052 public void clearAccountsForPackage(String packageName) { 1053 try { 1054 if (isServiceConnected() && !TextUtils.isEmpty(packageName)) { 1055 getTelecomService().clearAccounts(packageName); 1056 } 1057 } catch (RemoteException e) { 1058 Log.e(TAG, "Error calling ITelecomService#clearAccountsForPackage", e); 1059 } 1060 } 1061 1062 1063 /** 1064 * @deprecated - Use {@link TelecomManager#getDefaultDialerPackage} to directly access 1065 * the default dialer's package name instead. 1066 * @hide 1067 */ 1068 @SystemApi 1069 @SuppressLint("Doclava125") getDefaultPhoneApp()1070 public ComponentName getDefaultPhoneApp() { 1071 try { 1072 if (isServiceConnected()) { 1073 return getTelecomService().getDefaultPhoneApp(); 1074 } 1075 } catch (RemoteException e) { 1076 Log.e(TAG, "RemoteException attempting to get the default phone app.", e); 1077 } 1078 return null; 1079 } 1080 1081 /** 1082 * Used to determine the currently selected default dialer package. 1083 * 1084 * @return package name for the default dialer package or null if no package has been 1085 * selected as the default dialer. 1086 */ getDefaultDialerPackage()1087 public String getDefaultDialerPackage() { 1088 try { 1089 if (isServiceConnected()) { 1090 return getTelecomService().getDefaultDialerPackage(); 1091 } 1092 } catch (RemoteException e) { 1093 Log.e(TAG, "RemoteException attempting to get the default dialer package name.", e); 1094 } 1095 return null; 1096 } 1097 1098 /** 1099 * Used to set the default dialer package. 1100 * 1101 * @param packageName to set the default dialer to.. 1102 * 1103 * @result {@code true} if the default dialer was successfully changed, {@code false} if 1104 * the specified package does not correspond to an installed dialer, or is already 1105 * the default dialer. 1106 * 1107 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} 1108 * Requires permission: {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} 1109 * 1110 * @hide 1111 */ setDefaultDialer(String packageName)1112 public boolean setDefaultDialer(String packageName) { 1113 try { 1114 if (isServiceConnected()) { 1115 return getTelecomService().setDefaultDialer(packageName); 1116 } 1117 } catch (RemoteException e) { 1118 Log.e(TAG, "RemoteException attempting to set the default dialer.", e); 1119 } 1120 return false; 1121 } 1122 1123 /** 1124 * Used to determine the dialer package that is preloaded on the system partition. 1125 * 1126 * @return package name for the system dialer package or null if no system dialer is preloaded. 1127 * @hide 1128 */ getSystemDialerPackage()1129 public String getSystemDialerPackage() { 1130 try { 1131 if (isServiceConnected()) { 1132 return getTelecomService().getSystemDialerPackage(); 1133 } 1134 } catch (RemoteException e) { 1135 Log.e(TAG, "RemoteException attempting to get the system dialer package name.", e); 1136 } 1137 return null; 1138 } 1139 1140 /** 1141 * Return whether a given phone number is the configured voicemail number for a 1142 * particular phone account. 1143 * 1144 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 1145 * 1146 * @param accountHandle The handle for the account to check the voicemail number against 1147 * @param number The number to look up. 1148 */ 1149 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) isVoiceMailNumber(PhoneAccountHandle accountHandle, String number)1150 public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number) { 1151 try { 1152 if (isServiceConnected()) { 1153 return getTelecomService().isVoiceMailNumber(accountHandle, number, 1154 mContext.getOpPackageName()); 1155 } 1156 } catch (RemoteException e) { 1157 Log.e(TAG, "RemoteException calling ITelecomService#isVoiceMailNumber.", e); 1158 } 1159 return false; 1160 } 1161 1162 /** 1163 * Return the voicemail number for a given phone account. 1164 * 1165 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 1166 * 1167 * @param accountHandle The handle for the phone account. 1168 * @return The voicemail number for the phone account, and {@code null} if one has not been 1169 * configured. 1170 */ 1171 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) getVoiceMailNumber(PhoneAccountHandle accountHandle)1172 public String getVoiceMailNumber(PhoneAccountHandle accountHandle) { 1173 try { 1174 if (isServiceConnected()) { 1175 return getTelecomService().getVoiceMailNumber(accountHandle, 1176 mContext.getOpPackageName()); 1177 } 1178 } catch (RemoteException e) { 1179 Log.e(TAG, "RemoteException calling ITelecomService#hasVoiceMailNumber.", e); 1180 } 1181 return null; 1182 } 1183 1184 /** 1185 * Return the line 1 phone number for given phone account. 1186 * 1187 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 1188 * 1189 * @param accountHandle The handle for the account retrieve a number for. 1190 * @return A string representation of the line 1 phone number. 1191 */ 1192 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) getLine1Number(PhoneAccountHandle accountHandle)1193 public String getLine1Number(PhoneAccountHandle accountHandle) { 1194 try { 1195 if (isServiceConnected()) { 1196 return getTelecomService().getLine1Number(accountHandle, 1197 mContext.getOpPackageName()); 1198 } 1199 } catch (RemoteException e) { 1200 Log.e(TAG, "RemoteException calling ITelecomService#getLine1Number.", e); 1201 } 1202 return null; 1203 } 1204 1205 /** 1206 * Returns whether there is an ongoing phone call (can be in dialing, ringing, active or holding 1207 * states) originating from either a manager or self-managed {@link ConnectionService}. 1208 * <p> 1209 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 1210 * 1211 * @return {@code true} if there is an ongoing call in either a managed or self-managed 1212 * {@link ConnectionService}, {@code false} otherwise. 1213 */ 1214 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) isInCall()1215 public boolean isInCall() { 1216 try { 1217 if (isServiceConnected()) { 1218 return getTelecomService().isInCall(mContext.getOpPackageName()); 1219 } 1220 } catch (RemoteException e) { 1221 Log.e(TAG, "RemoteException calling isInCall().", e); 1222 } 1223 return false; 1224 } 1225 1226 /** 1227 * Returns whether there is an ongoing call originating from a managed 1228 * {@link ConnectionService}. An ongoing call can be in dialing, ringing, active or holding 1229 * states. 1230 * <p> 1231 * If you also need to know if there are ongoing self-managed calls, use {@link #isInCall()} 1232 * instead. 1233 * <p> 1234 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 1235 * 1236 * @return {@code true} if there is an ongoing call in a managed {@link ConnectionService}, 1237 * {@code false} otherwise. 1238 */ 1239 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) isInManagedCall()1240 public boolean isInManagedCall() { 1241 try { 1242 if (isServiceConnected()) { 1243 return getTelecomService().isInManagedCall(mContext.getOpPackageName()); 1244 } 1245 } catch (RemoteException e) { 1246 Log.e(TAG, "RemoteException calling isInManagedCall().", e); 1247 } 1248 return false; 1249 } 1250 1251 /** 1252 * Returns one of the following constants that represents the current state of Telecom: 1253 * 1254 * {@link TelephonyManager#CALL_STATE_RINGING} 1255 * {@link TelephonyManager#CALL_STATE_OFFHOOK} 1256 * {@link TelephonyManager#CALL_STATE_IDLE} 1257 * 1258 * Note that this API does not require the 1259 * {@link android.Manifest.permission#READ_PHONE_STATE} permission. This is intentional, to 1260 * preserve the behavior of {@link TelephonyManager#getCallState()}, which also did not require 1261 * the permission. 1262 * 1263 * Takes into consideration both managed and self-managed calls. 1264 * 1265 * @hide 1266 */ 1267 @SystemApi getCallState()1268 public int getCallState() { 1269 try { 1270 if (isServiceConnected()) { 1271 return getTelecomService().getCallState(); 1272 } 1273 } catch (RemoteException e) { 1274 Log.d(TAG, "RemoteException calling getCallState().", e); 1275 } 1276 return TelephonyManager.CALL_STATE_IDLE; 1277 } 1278 1279 /** 1280 * Returns whether there currently exists is a ringing incoming-call. 1281 * 1282 * @return {@code true} if there is a managed or self-managed ringing call. 1283 * @hide 1284 */ 1285 @SystemApi 1286 @RequiresPermission(anyOf = { 1287 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 1288 android.Manifest.permission.READ_PHONE_STATE 1289 }) isRinging()1290 public boolean isRinging() { 1291 try { 1292 if (isServiceConnected()) { 1293 return getTelecomService().isRinging(mContext.getOpPackageName()); 1294 } 1295 } catch (RemoteException e) { 1296 Log.e(TAG, "RemoteException attempting to get ringing state of phone app.", e); 1297 } 1298 return false; 1299 } 1300 1301 /** 1302 * Ends the foreground call on the device. 1303 * <p> 1304 * If there is a ringing call, calling this method rejects the ringing call. Otherwise the 1305 * foreground call is ended. 1306 * <p> 1307 * Requires permission {@link android.Manifest.permission#ANSWER_PHONE_CALLS}. 1308 * <p> 1309 * Note: this method CANNOT be used to end ongoing emergency calls and will return {@code false} 1310 * if an attempt is made to end an emergency call. 1311 * 1312 * @return {@code true} if there is a call which will be rejected or terminated, {@code false} 1313 * otherwise. 1314 */ 1315 @RequiresPermission(Manifest.permission.ANSWER_PHONE_CALLS) 1316 @SystemApi endCall()1317 public boolean endCall() { 1318 try { 1319 if (isServiceConnected()) { 1320 return getTelecomService().endCall(mContext.getPackageName()); 1321 } 1322 } catch (RemoteException e) { 1323 Log.e(TAG, "Error calling ITelecomService#endCall", e); 1324 } 1325 return false; 1326 } 1327 1328 /** 1329 * If there is a ringing incoming call, this method accepts the call on behalf of the user. 1330 * 1331 * If the incoming call is a video call, the call will be answered with the same video state as 1332 * the incoming call requests. This means, for example, that an incoming call requesting 1333 * {@link VideoProfile#STATE_BIDIRECTIONAL} will be answered, accepting that state. 1334 * 1335 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} or 1336 * {@link android.Manifest.permission#ANSWER_PHONE_CALLS} 1337 */ 1338 //TODO: L-release - need to convert all invocation of ITelecmmService#answerRingingCall to use 1339 // this method (clockwork & gearhead). 1340 @RequiresPermission(anyOf = 1341 {Manifest.permission.ANSWER_PHONE_CALLS, Manifest.permission.MODIFY_PHONE_STATE}) acceptRingingCall()1342 public void acceptRingingCall() { 1343 try { 1344 if (isServiceConnected()) { 1345 getTelecomService().acceptRingingCall(mContext.getPackageName()); 1346 } 1347 } catch (RemoteException e) { 1348 Log.e(TAG, "Error calling ITelecomService#acceptRingingCall", e); 1349 } 1350 } 1351 1352 /** 1353 * If there is a ringing incoming call, this method accepts the call on behalf of the user, 1354 * with the specified video state. 1355 * 1356 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} or 1357 * {@link android.Manifest.permission#ANSWER_PHONE_CALLS} 1358 * 1359 * @param videoState The desired video state to answer the call with. 1360 */ 1361 @RequiresPermission(anyOf = 1362 {Manifest.permission.ANSWER_PHONE_CALLS, Manifest.permission.MODIFY_PHONE_STATE}) acceptRingingCall(int videoState)1363 public void acceptRingingCall(int videoState) { 1364 try { 1365 if (isServiceConnected()) { 1366 getTelecomService().acceptRingingCallWithVideoState( 1367 mContext.getPackageName(), videoState); 1368 } 1369 } catch (RemoteException e) { 1370 Log.e(TAG, "Error calling ITelecomService#acceptRingingCallWithVideoState", e); 1371 } 1372 } 1373 1374 /** 1375 * Silences the ringer if a ringing call exists. 1376 * 1377 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} 1378 */ 1379 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) silenceRinger()1380 public void silenceRinger() { 1381 try { 1382 if (isServiceConnected()) { 1383 getTelecomService().silenceRinger(mContext.getOpPackageName()); 1384 } 1385 } catch (RemoteException e) { 1386 Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); 1387 } 1388 } 1389 1390 /** 1391 * Returns whether TTY is supported on this device. 1392 */ 1393 @SystemApi 1394 @RequiresPermission(anyOf = { 1395 android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 1396 android.Manifest.permission.READ_PHONE_STATE 1397 }) isTtySupported()1398 public boolean isTtySupported() { 1399 try { 1400 if (isServiceConnected()) { 1401 return getTelecomService().isTtySupported(mContext.getOpPackageName()); 1402 } 1403 } catch (RemoteException e) { 1404 Log.e(TAG, "RemoteException attempting to get TTY supported state.", e); 1405 } 1406 return false; 1407 } 1408 1409 /** 1410 * Returns the current TTY mode of the device. For TTY to be on the user must enable it in 1411 * settings and have a wired headset plugged in. 1412 * Valid modes are: 1413 * - {@link TelecomManager#TTY_MODE_OFF} 1414 * - {@link TelecomManager#TTY_MODE_FULL} 1415 * - {@link TelecomManager#TTY_MODE_HCO} 1416 * - {@link TelecomManager#TTY_MODE_VCO} 1417 * @hide 1418 */ getCurrentTtyMode()1419 public int getCurrentTtyMode() { 1420 try { 1421 if (isServiceConnected()) { 1422 return getTelecomService().getCurrentTtyMode(mContext.getOpPackageName()); 1423 } 1424 } catch (RemoteException e) { 1425 Log.e(TAG, "RemoteException attempting to get the current TTY mode.", e); 1426 } 1427 return TTY_MODE_OFF; 1428 } 1429 1430 /** 1431 * Registers a new incoming call. A {@link ConnectionService} should invoke this method when it 1432 * has an incoming call. For managed {@link ConnectionService}s, the specified 1433 * {@link PhoneAccountHandle} must have been registered with {@link #registerPhoneAccount} and 1434 * the user must have enabled the corresponding {@link PhoneAccount}. This can be checked using 1435 * {@link #getPhoneAccount}. Self-managed {@link ConnectionService}s must have 1436 * {@link android.Manifest.permission#MANAGE_OWN_CALLS} to add a new incoming call. 1437 * <p> 1438 * The incoming call you are adding is assumed to have a video state of 1439 * {@link VideoProfile#STATE_AUDIO_ONLY}, unless the extra value 1440 * {@link #EXTRA_INCOMING_VIDEO_STATE} is specified. 1441 * <p> 1442 * Once invoked, this method will cause the system to bind to the {@link ConnectionService} 1443 * associated with the {@link PhoneAccountHandle} and request additional information about the 1444 * call (See {@link ConnectionService#onCreateIncomingConnection}) before starting the incoming 1445 * call UI. 1446 * <p> 1447 * For a managed {@link ConnectionService}, a {@link SecurityException} will be thrown if either 1448 * the {@link PhoneAccountHandle} does not correspond to a registered {@link PhoneAccount} or 1449 * the associated {@link PhoneAccount} is not currently enabled by the user. 1450 * <p> 1451 * For a self-managed {@link ConnectionService}, a {@link SecurityException} will be thrown if 1452 * the {@link PhoneAccount} has {@link PhoneAccount#CAPABILITY_SELF_MANAGED} and the calling app 1453 * does not have {@link android.Manifest.permission#MANAGE_OWN_CALLS}. 1454 * 1455 * @param phoneAccount A {@link PhoneAccountHandle} registered with 1456 * {@link #registerPhoneAccount}. 1457 * @param extras A bundle that will be passed through to 1458 * {@link ConnectionService#onCreateIncomingConnection}. 1459 */ addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras)1460 public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) { 1461 try { 1462 if (isServiceConnected()) { 1463 if (extras != null && extras.getBoolean(EXTRA_IS_HANDOVER) && 1464 mContext.getApplicationContext().getApplicationInfo().targetSdkVersion > 1465 Build.VERSION_CODES.O_MR1) { 1466 Log.e("TAG", "addNewIncomingCall failed. Use public api " + 1467 "acceptHandover for API > O-MR1"); 1468 // TODO add "return" after DUO team adds support for new handover API 1469 } 1470 getTelecomService().addNewIncomingCall( 1471 phoneAccount, extras == null ? new Bundle() : extras); 1472 } 1473 } catch (RemoteException e) { 1474 Log.e(TAG, "RemoteException adding a new incoming call: " + phoneAccount, e); 1475 } 1476 } 1477 1478 /** 1479 * Registers a new unknown call with Telecom. This can only be called by the system Telephony 1480 * service. This is invoked when Telephony detects a new unknown connection that was neither 1481 * a new incoming call, nor an user-initiated outgoing call. 1482 * 1483 * @param phoneAccount A {@link PhoneAccountHandle} registered with 1484 * {@link #registerPhoneAccount}. 1485 * @param extras A bundle that will be passed through to 1486 * {@link ConnectionService#onCreateIncomingConnection}. 1487 * @hide 1488 */ 1489 @SystemApi addNewUnknownCall(PhoneAccountHandle phoneAccount, Bundle extras)1490 public void addNewUnknownCall(PhoneAccountHandle phoneAccount, Bundle extras) { 1491 try { 1492 if (isServiceConnected()) { 1493 getTelecomService().addNewUnknownCall( 1494 phoneAccount, extras == null ? new Bundle() : extras); 1495 } 1496 } catch (RemoteException e) { 1497 Log.e(TAG, "RemoteException adding a new unknown call: " + phoneAccount, e); 1498 } 1499 } 1500 1501 /** 1502 * Processes the specified dial string as an MMI code. 1503 * MMI codes are any sequence of characters entered into the dialpad that contain a "*" or "#". 1504 * Some of these sequences launch special behavior through handled by Telephony. 1505 * This method uses the default subscription. 1506 * <p> 1507 * Requires that the method-caller be set as the system dialer app. 1508 * </p> 1509 * 1510 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} 1511 * 1512 * @param dialString The digits to dial. 1513 * @return True if the digits were processed as an MMI code, false otherwise. 1514 */ 1515 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) handleMmi(String dialString)1516 public boolean handleMmi(String dialString) { 1517 ITelecomService service = getTelecomService(); 1518 if (service != null) { 1519 try { 1520 return service.handlePinMmi(dialString, mContext.getOpPackageName()); 1521 } catch (RemoteException e) { 1522 Log.e(TAG, "Error calling ITelecomService#handlePinMmi", e); 1523 } 1524 } 1525 return false; 1526 } 1527 1528 /** 1529 * Processes the specified dial string as an MMI code. 1530 * MMI codes are any sequence of characters entered into the dialpad that contain a "*" or "#". 1531 * Some of these sequences launch special behavior through handled by Telephony. 1532 * <p> 1533 * Requires that the method-caller be set as the system dialer app. 1534 * </p> 1535 * 1536 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} 1537 * 1538 * @param accountHandle The handle for the account the MMI code should apply to. 1539 * @param dialString The digits to dial. 1540 * @return True if the digits were processed as an MMI code, false otherwise. 1541 */ 1542 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) handleMmi(String dialString, PhoneAccountHandle accountHandle)1543 public boolean handleMmi(String dialString, PhoneAccountHandle accountHandle) { 1544 ITelecomService service = getTelecomService(); 1545 if (service != null) { 1546 try { 1547 return service.handlePinMmiForPhoneAccount(accountHandle, dialString, 1548 mContext.getOpPackageName()); 1549 } catch (RemoteException e) { 1550 Log.e(TAG, "Error calling ITelecomService#handlePinMmi", e); 1551 } 1552 } 1553 return false; 1554 } 1555 1556 /** 1557 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} 1558 * 1559 * @param accountHandle The handle for the account to derive an adn query URI for or 1560 * {@code null} to return a URI which will use the default account. 1561 * @return The URI (with the content:// scheme) specific to the specified {@link PhoneAccount} 1562 * for the the content retrieve. 1563 */ 1564 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle)1565 public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle) { 1566 ITelecomService service = getTelecomService(); 1567 if (service != null && accountHandle != null) { 1568 try { 1569 return service.getAdnUriForPhoneAccount(accountHandle, mContext.getOpPackageName()); 1570 } catch (RemoteException e) { 1571 Log.e(TAG, "Error calling ITelecomService#getAdnUriForPhoneAccount", e); 1572 } 1573 } 1574 return Uri.parse("content://icc/adn"); 1575 } 1576 1577 /** 1578 * Removes the missed-call notification if one is present. 1579 * <p> 1580 * Requires that the method-caller be set as the system dialer app. 1581 * </p> 1582 * 1583 * Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} 1584 */ 1585 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) cancelMissedCallsNotification()1586 public void cancelMissedCallsNotification() { 1587 ITelecomService service = getTelecomService(); 1588 if (service != null) { 1589 try { 1590 service.cancelMissedCallsNotification(mContext.getOpPackageName()); 1591 } catch (RemoteException e) { 1592 Log.e(TAG, "Error calling ITelecomService#cancelMissedCallsNotification", e); 1593 } 1594 } 1595 } 1596 1597 /** 1598 * Brings the in-call screen to the foreground if there is an ongoing call. If there is 1599 * currently no ongoing call, then this method does nothing. 1600 * <p> 1601 * Requires that the method-caller be set as the system dialer app or have the 1602 * {@link android.Manifest.permission#READ_PHONE_STATE} permission. 1603 * </p> 1604 * 1605 * @param showDialpad Brings up the in-call dialpad as part of showing the in-call screen. 1606 */ 1607 @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) showInCallScreen(boolean showDialpad)1608 public void showInCallScreen(boolean showDialpad) { 1609 ITelecomService service = getTelecomService(); 1610 if (service != null) { 1611 try { 1612 service.showInCallScreen(showDialpad, mContext.getOpPackageName()); 1613 } catch (RemoteException e) { 1614 Log.e(TAG, "Error calling ITelecomService#showCallScreen", e); 1615 } 1616 } 1617 } 1618 1619 /** 1620 * Places a new outgoing call to the provided address using the system telecom service with 1621 * the specified extras. 1622 * 1623 * This method is equivalent to placing an outgoing call using {@link Intent#ACTION_CALL}, 1624 * except that the outgoing call will always be sent via the system telecom service. If 1625 * method-caller is either the user selected default dialer app or preloaded system dialer 1626 * app, then emergency calls will also be allowed. 1627 * 1628 * Placing a call via a managed {@link ConnectionService} requires permission: 1629 * {@link android.Manifest.permission#CALL_PHONE} 1630 * 1631 * Usage example: 1632 * <pre> 1633 * Uri uri = Uri.fromParts("tel", "12345", null); 1634 * Bundle extras = new Bundle(); 1635 * extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, true); 1636 * telecomManager.placeCall(uri, extras); 1637 * </pre> 1638 * 1639 * The following keys are supported in the supplied extras. 1640 * <ul> 1641 * <li>{@link #EXTRA_OUTGOING_CALL_EXTRAS}</li> 1642 * <li>{@link #EXTRA_PHONE_ACCOUNT_HANDLE}</li> 1643 * <li>{@link #EXTRA_START_CALL_WITH_SPEAKERPHONE}</li> 1644 * <li>{@link #EXTRA_START_CALL_WITH_VIDEO_STATE}</li> 1645 * </ul> 1646 * <p> 1647 * An app which implements the self-managed {@link ConnectionService} API uses 1648 * {@link #placeCall(Uri, Bundle)} to inform Telecom of a new outgoing call. A self-managed 1649 * {@link ConnectionService} must include {@link #EXTRA_PHONE_ACCOUNT_HANDLE} to specify its 1650 * associated {@link android.telecom.PhoneAccountHandle}. 1651 * 1652 * Self-managed {@link ConnectionService}s require permission 1653 * {@link android.Manifest.permission#MANAGE_OWN_CALLS}. 1654 * 1655 * @param address The address to make the call to. 1656 * @param extras Bundle of extras to use with the call. 1657 */ 1658 @RequiresPermission(anyOf = {android.Manifest.permission.CALL_PHONE, 1659 android.Manifest.permission.MANAGE_OWN_CALLS}) placeCall(Uri address, Bundle extras)1660 public void placeCall(Uri address, Bundle extras) { 1661 ITelecomService service = getTelecomService(); 1662 if (service != null) { 1663 if (address == null) { 1664 Log.w(TAG, "Cannot place call to empty address."); 1665 } 1666 try { 1667 service.placeCall(address, extras == null ? new Bundle() : extras, 1668 mContext.getOpPackageName()); 1669 } catch (RemoteException e) { 1670 Log.e(TAG, "Error calling ITelecomService#placeCall", e); 1671 } 1672 } 1673 } 1674 1675 /** 1676 * Enables and disables specified phone account. 1677 * 1678 * @param handle Handle to the phone account. 1679 * @param isEnabled Enable state of the phone account. 1680 * @hide 1681 */ 1682 @SystemApi 1683 @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) enablePhoneAccount(PhoneAccountHandle handle, boolean isEnabled)1684 public void enablePhoneAccount(PhoneAccountHandle handle, boolean isEnabled) { 1685 ITelecomService service = getTelecomService(); 1686 if (service != null) { 1687 try { 1688 service.enablePhoneAccount(handle, isEnabled); 1689 } catch (RemoteException e) { 1690 Log.e(TAG, "Error enablePhoneAbbount", e); 1691 } 1692 } 1693 } 1694 1695 /** 1696 * Dumps telecom analytics for uploading. 1697 * 1698 * @return 1699 * @hide 1700 */ 1701 @SystemApi 1702 @RequiresPermission(Manifest.permission.DUMP) dumpAnalytics()1703 public TelecomAnalytics dumpAnalytics() { 1704 ITelecomService service = getTelecomService(); 1705 TelecomAnalytics result = null; 1706 if (service != null) { 1707 try { 1708 result = service.dumpCallAnalytics(); 1709 } catch (RemoteException e) { 1710 Log.e(TAG, "Error dumping call analytics", e); 1711 } 1712 } 1713 return result; 1714 } 1715 1716 /** 1717 * Creates the {@link Intent} which can be used with {@link Context#startActivity(Intent)} to 1718 * launch the activity to manage blocked numbers. 1719 * <p> The activity will display the UI to manage blocked numbers only if 1720 * {@link android.provider.BlockedNumberContract#canCurrentUserBlockNumbers(Context)} returns 1721 * {@code true} for the current user. 1722 */ createManageBlockedNumbersIntent()1723 public Intent createManageBlockedNumbersIntent() { 1724 ITelecomService service = getTelecomService(); 1725 Intent result = null; 1726 if (service != null) { 1727 try { 1728 result = service.createManageBlockedNumbersIntent(); 1729 } catch (RemoteException e) { 1730 Log.e(TAG, "Error calling ITelecomService#createManageBlockedNumbersIntent", e); 1731 } 1732 } 1733 return result; 1734 } 1735 1736 /** 1737 * Determines whether Telecom would permit an incoming call to be added via the 1738 * {@link #addNewIncomingCall(PhoneAccountHandle, Bundle)} API for the specified 1739 * {@link PhoneAccountHandle}. 1740 * <p> 1741 * A {@link ConnectionService} may not add a call for the specified {@link PhoneAccountHandle} 1742 * in the following situations: 1743 * <ul> 1744 * <li>{@link PhoneAccount} does not have property 1745 * {@link PhoneAccount#CAPABILITY_SELF_MANAGED} set (i.e. it is a managed 1746 * {@link ConnectionService}), and the active or held call limit has 1747 * been reached.</li> 1748 * <li>There is an ongoing emergency call.</li> 1749 * </ul> 1750 * 1751 * @param phoneAccountHandle The {@link PhoneAccountHandle} the call will be added for. 1752 * @return {@code true} if telecom will permit an incoming call to be added, {@code false} 1753 * otherwise. 1754 */ isIncomingCallPermitted(PhoneAccountHandle phoneAccountHandle)1755 public boolean isIncomingCallPermitted(PhoneAccountHandle phoneAccountHandle) { 1756 if (phoneAccountHandle == null) { 1757 return false; 1758 } 1759 1760 ITelecomService service = getTelecomService(); 1761 if (service != null) { 1762 try { 1763 return service.isIncomingCallPermitted(phoneAccountHandle); 1764 } catch (RemoteException e) { 1765 Log.e(TAG, "Error isIncomingCallPermitted", e); 1766 } 1767 } 1768 return false; 1769 } 1770 1771 /** 1772 * Determines whether Telecom would permit an outgoing call to be placed via the 1773 * {@link #placeCall(Uri, Bundle)} API for the specified {@link PhoneAccountHandle}. 1774 * <p> 1775 * A {@link ConnectionService} may not place a call for the specified {@link PhoneAccountHandle} 1776 * in the following situations: 1777 * <ul> 1778 * <li>{@link PhoneAccount} does not have property 1779 * {@link PhoneAccount#CAPABILITY_SELF_MANAGED} set (i.e. it is a managed 1780 * {@link ConnectionService}), and the active, held or ringing call limit has 1781 * been reached.</li> 1782 * <li>{@link PhoneAccount} has property {@link PhoneAccount#CAPABILITY_SELF_MANAGED} set 1783 * (i.e. it is a self-managed {@link ConnectionService} and there is an ongoing call in 1784 * another {@link ConnectionService}.</li> 1785 * <li>There is an ongoing emergency call.</li> 1786 * </ul> 1787 * 1788 * @param phoneAccountHandle The {@link PhoneAccountHandle} the call will be added for. 1789 * @return {@code true} if telecom will permit an outgoing call to be placed, {@code false} 1790 * otherwise. 1791 */ isOutgoingCallPermitted(PhoneAccountHandle phoneAccountHandle)1792 public boolean isOutgoingCallPermitted(PhoneAccountHandle phoneAccountHandle) { 1793 ITelecomService service = getTelecomService(); 1794 if (service != null) { 1795 try { 1796 return service.isOutgoingCallPermitted(phoneAccountHandle); 1797 } catch (RemoteException e) { 1798 Log.e(TAG, "Error isOutgoingCallPermitted", e); 1799 } 1800 } 1801 return false; 1802 } 1803 1804 /** 1805 * Called by an app to indicate that it wishes to accept the handover of an ongoing call to a 1806 * {@link PhoneAccountHandle} it defines. 1807 * <p> 1808 * A call handover is the process where an ongoing call is transferred from one app (i.e. 1809 * {@link ConnectionService} to another app. The user could, for example, choose to continue a 1810 * mobile network call in a video calling app. The mobile network call via the Telephony stack 1811 * is referred to as the source of the handover, and the video calling app is referred to as the 1812 * destination. 1813 * <p> 1814 * When considering a handover scenario the <em>initiating</em> device is where a user initiated 1815 * the handover process (e.g. by calling {@link android.telecom.Call#handoverTo( 1816 * PhoneAccountHandle, int, Bundle)}, and the other device is considered the <em>receiving</em> 1817 * device. 1818 * <p> 1819 * For a full discussion of the handover process and the APIs involved, see 1820 * {@link android.telecom.Call#handoverTo(PhoneAccountHandle, int, Bundle)}. 1821 * <p> 1822 * This method is called from the <em>receiving</em> side of a handover to indicate a desire to 1823 * accept the handover of an ongoing call to another {@link ConnectionService} identified by 1824 * {@link PhoneAccountHandle} destAcct. For managed {@link ConnectionService}s, the specified 1825 * {@link PhoneAccountHandle} must have been registered with {@link #registerPhoneAccount} and 1826 * the user must have enabled the corresponding {@link PhoneAccount}. This can be checked using 1827 * {@link #getPhoneAccount}. Self-managed {@link ConnectionService}s must have 1828 * {@link android.Manifest.permission#MANAGE_OWN_CALLS} to handover a call to it. 1829 * <p> 1830 * Once invoked, this method will cause the system to bind to the {@link ConnectionService} 1831 * associated with the {@link PhoneAccountHandle} destAcct and call 1832 * (See {@link ConnectionService#onCreateIncomingHandoverConnection}). 1833 * <p> 1834 * For a managed {@link ConnectionService}, a {@link SecurityException} will be thrown if either 1835 * the {@link PhoneAccountHandle} destAcct does not correspond to a registered 1836 * {@link PhoneAccount} or the associated {@link PhoneAccount} is not currently enabled by the 1837 * user. 1838 * <p> 1839 * For a self-managed {@link ConnectionService}, a {@link SecurityException} will be thrown if 1840 * the calling app does not have {@link android.Manifest.permission#MANAGE_OWN_CALLS}. 1841 * 1842 * @param srcAddr The {@link android.net.Uri} of the ongoing call to handover to the caller’s 1843 * {@link ConnectionService}. 1844 * @param videoState Video state after the handover. 1845 * @param destAcct The {@link PhoneAccountHandle} registered to the calling package. 1846 */ acceptHandover(Uri srcAddr, @VideoProfile.VideoState int videoState, PhoneAccountHandle destAcct)1847 public void acceptHandover(Uri srcAddr, @VideoProfile.VideoState int videoState, 1848 PhoneAccountHandle destAcct) { 1849 try { 1850 if (isServiceConnected()) { 1851 getTelecomService().acceptHandover(srcAddr, videoState, destAcct); 1852 } 1853 } catch (RemoteException e) { 1854 Log.e(TAG, "RemoteException acceptHandover: " + e); 1855 } 1856 } 1857 getTelecomService()1858 private ITelecomService getTelecomService() { 1859 if (mTelecomServiceOverride != null) { 1860 return mTelecomServiceOverride; 1861 } 1862 return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE)); 1863 } 1864 isServiceConnected()1865 private boolean isServiceConnected() { 1866 boolean isConnected = getTelecomService() != null; 1867 if (!isConnected) { 1868 Log.w(TAG, "Telecom Service not found."); 1869 } 1870 return isConnected; 1871 } 1872 } 1873