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