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.annotation.SystemApi; 18 import android.content.ComponentName; 19 import android.content.Context; 20 import android.os.Bundle; 21 import android.os.RemoteException; 22 import android.os.ServiceManager; 23 import android.telephony.TelephonyManager; 24 import android.util.Log; 25 26 import com.android.internal.telecom.ITelecomService; 27 28 import java.util.ArrayList; 29 import java.util.Collections; 30 import java.util.List; 31 32 /** 33 * Provides access to Telecom-related functionality. 34 * TODO: Move this all into PhoneManager. 35 */ 36 public class TelecomManager { 37 38 /** 39 * Activity action: Starts the UI for handing an incoming call. This intent starts the in-call 40 * UI by notifying the Telecom system that an incoming call exists for a specific call service 41 * (see {@link android.telecom.ConnectionService}). Telecom reads the Intent extras to find 42 * and bind to the appropriate {@link android.telecom.ConnectionService} which Telecom will 43 * ultimately use to control and get information about the call. 44 * <p> 45 * Input: get*Extra field {@link #EXTRA_PHONE_ACCOUNT_HANDLE} contains the component name of the 46 * {@link android.telecom.ConnectionService} that Telecom should bind to. Telecom will then 47 * ask the connection service for more information about the call prior to showing any UI. 48 * 49 * @hide 50 */ 51 public static final String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL"; 52 53 /** 54 * Similar to {@link #ACTION_INCOMING_CALL}, but is used only by Telephony to add a new 55 * sim-initiated MO call for carrier testing. 56 * @hide 57 */ 58 public static final String ACTION_NEW_UNKNOWN_CALL = "android.telecom.action.NEW_UNKNOWN_CALL"; 59 60 /** 61 * The {@link android.content.Intent} action used to configure a 62 * {@link android.telecom.ConnectionService}. 63 * @hide 64 */ 65 public static final String ACTION_CONNECTION_SERVICE_CONFIGURE = 66 "android.telecom.action.CONNECTION_SERVICE_CONFIGURE"; 67 68 /** 69 * The {@link android.content.Intent} action used to show the call settings page. 70 */ 71 public static final String ACTION_SHOW_CALL_SETTINGS = 72 "android.telecom.action.SHOW_CALL_SETTINGS"; 73 74 /** 75 * The {@link android.content.Intent} action used to show the settings page used to configure 76 * {@link PhoneAccount} preferences. 77 * @hide 78 */ 79 public static final String ACTION_CHANGE_PHONE_ACCOUNTS = 80 "android.telecom.action.CHANGE_PHONE_ACCOUNTS"; 81 82 /** 83 * Optional extra for {@link android.content.Intent#ACTION_CALL} containing a boolean that 84 * determines whether the speakerphone should be automatically turned on for an outgoing call. 85 */ 86 public static final String EXTRA_START_CALL_WITH_SPEAKERPHONE = 87 "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE"; 88 89 /** 90 * Optional extra for {@link android.content.Intent#ACTION_CALL} containing an integer that 91 * determines the desired video state for an outgoing call. 92 * Valid options: 93 * {@link VideoProfile.VideoState#AUDIO_ONLY}, 94 * {@link VideoProfile.VideoState#BIDIRECTIONAL}, 95 * {@link VideoProfile.VideoState#RX_ENABLED}, 96 * {@link VideoProfile.VideoState#TX_ENABLED}. 97 * @hide 98 */ 99 public static final String EXTRA_START_CALL_WITH_VIDEO_STATE = 100 "android.telecom.extra.START_CALL_WITH_VIDEO_STATE"; 101 102 /** 103 * The extra used with an {@link android.content.Intent#ACTION_CALL} and 104 * {@link android.content.Intent#ACTION_DIAL} {@code Intent} to specify a 105 * {@link PhoneAccountHandle} to use when making the call. 106 * <p class="note"> 107 * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}. 108 * @hide 109 */ 110 public static final String EXTRA_PHONE_ACCOUNT_HANDLE = 111 "android.telecom.extra.PHONE_ACCOUNT_HANDLE"; 112 113 /** 114 * Optional extra for {@link #ACTION_INCOMING_CALL} containing a {@link Bundle} which contains 115 * metadata about the call. This {@link Bundle} will be returned to the 116 * {@link ConnectionService}. 117 * 118 * @hide 119 */ 120 public static final String EXTRA_INCOMING_CALL_EXTRAS = 121 "android.telecom.extra.INCOMING_CALL_EXTRAS"; 122 123 /** 124 * Optional extra for {@link android.content.Intent#ACTION_CALL} and 125 * {@link android.content.Intent#ACTION_DIAL} {@code Intent} containing a {@link Bundle} 126 * which contains metadata about the call. This {@link Bundle} will be saved into 127 * {@code Call.Details}. 128 * 129 * @hide 130 */ 131 public static final String EXTRA_OUTGOING_CALL_EXTRAS = 132 "android.telecom.extra.OUTGOING_CALL_EXTRAS"; 133 134 /** 135 * @hide 136 */ 137 public static final String EXTRA_UNKNOWN_CALL_HANDLE = 138 "android.telecom.extra.UNKNOWN_CALL_HANDLE"; 139 140 /** 141 * Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED} 142 * containing the disconnect code. 143 */ 144 public static final String EXTRA_CALL_DISCONNECT_CAUSE = 145 "android.telecom.extra.CALL_DISCONNECT_CAUSE"; 146 147 /** 148 * Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED} 149 * containing the disconnect message. 150 */ 151 public static final String EXTRA_CALL_DISCONNECT_MESSAGE = 152 "android.telecom.extra.CALL_DISCONNECT_MESSAGE"; 153 154 /** 155 * Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED} 156 * containing the component name of the associated connection service. 157 * @hide 158 */ 159 public static final String EXTRA_CONNECTION_SERVICE = 160 "android.telecom.extra.CONNECTION_SERVICE"; 161 162 /** 163 * An optional {@link android.content.Intent#ACTION_CALL} intent extra denoting the 164 * package name of the app specifying an alternative gateway for the call. 165 * The value is a string. 166 * 167 * (The following comment corresponds to the all GATEWAY_* extras) 168 * An app which sends the {@link android.content.Intent#ACTION_CALL} intent can specify an 169 * alternative address to dial which is different from the one specified and displayed to 170 * the user. This alternative address is referred to as the gateway address. 171 */ 172 public static final String GATEWAY_PROVIDER_PACKAGE = 173 "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; 174 175 /** 176 * An optional {@link android.content.Intent#ACTION_CALL} intent extra corresponding to the 177 * original address to dial for the call. This is used when an alternative gateway address is 178 * provided to recall the original address. 179 * The value is a {@link android.net.Uri}. 180 * 181 * (See {@link #GATEWAY_PROVIDER_PACKAGE} for details) 182 */ 183 public static final String GATEWAY_ORIGINAL_ADDRESS = 184 "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; 185 186 /** 187 * The number which the party on the other side of the line will see (and use to return the 188 * call). 189 * <p> 190 * {@link ConnectionService}s which interact with {@link RemoteConnection}s should only populate 191 * this if the {@link android.telephony.TelephonyManager#getLine1Number()} value, as that is the 192 * user's expected caller ID. 193 * @hide 194 */ 195 public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER"; 196 197 /** 198 * The dual tone multi-frequency signaling character sent to indicate the dialing system should 199 * pause for a predefined period. 200 */ 201 public static final char DTMF_CHARACTER_PAUSE = ','; 202 203 /** 204 * The dual-tone multi-frequency signaling character sent to indicate the dialing system should 205 * wait for user confirmation before proceeding. 206 */ 207 public static final char DTMF_CHARACTER_WAIT = ';'; 208 209 /** 210 * TTY (teletypewriter) mode is off. 211 * 212 * @hide 213 */ 214 public static final int TTY_MODE_OFF = 0; 215 216 /** 217 * TTY (teletypewriter) mode is on. The speaker is off and the microphone is muted. The user 218 * will communicate with the remote party by sending and receiving text messages. 219 * 220 * @hide 221 */ 222 public static final int TTY_MODE_FULL = 1; 223 224 /** 225 * TTY (teletypewriter) mode is in hearing carryover mode (HCO). The microphone is muted but the 226 * speaker is on. The user will communicate with the remote party by sending text messages and 227 * hearing an audible reply. 228 * 229 * @hide 230 */ 231 public static final int TTY_MODE_HCO = 2; 232 233 /** 234 * TTY (teletypewriter) mode is in voice carryover mode (VCO). The speaker is off but the 235 * microphone is still on. User will communicate with the remote party by speaking and receiving 236 * text message replies. 237 * 238 * @hide 239 */ 240 public static final int TTY_MODE_VCO = 3; 241 242 /** 243 * Broadcast intent action indicating that the current TTY mode has changed. An intent extra 244 * provides this state as an int. 245 * 246 * @see #EXTRA_CURRENT_TTY_MODE 247 * @hide 248 */ 249 public static final String ACTION_CURRENT_TTY_MODE_CHANGED = 250 "android.telecom.action.CURRENT_TTY_MODE_CHANGED"; 251 252 /** 253 * The lookup key for an int that indicates the current TTY mode. 254 * Valid modes are: 255 * - {@link #TTY_MODE_OFF} 256 * - {@link #TTY_MODE_FULL} 257 * - {@link #TTY_MODE_HCO} 258 * - {@link #TTY_MODE_VCO} 259 * 260 * @hide 261 */ 262 public static final String EXTRA_CURRENT_TTY_MODE = 263 "android.telecom.intent.extra.CURRENT_TTY_MODE"; 264 265 /** 266 * Broadcast intent action indicating that the TTY preferred operating mode has changed. An 267 * intent extra provides the new mode as an int. 268 * 269 * @see #EXTRA_TTY_PREFERRED_MODE 270 * @hide 271 */ 272 public static final String ACTION_TTY_PREFERRED_MODE_CHANGED = 273 "android.telecom.action.TTY_PREFERRED_MODE_CHANGED"; 274 275 /** 276 * The lookup key for an int that indicates preferred TTY mode. Valid modes are: - 277 * {@link #TTY_MODE_OFF} - {@link #TTY_MODE_FULL} - {@link #TTY_MODE_HCO} - 278 * {@link #TTY_MODE_VCO} 279 * 280 * @hide 281 */ 282 public static final String EXTRA_TTY_PREFERRED_MODE = 283 "android.telecom.intent.extra.TTY_PREFERRED"; 284 285 /** 286 * The following 4 constants define how properties such as phone numbers and names are 287 * displayed to the user. 288 */ 289 290 /** Property is displayed normally. */ 291 public static final int PRESENTATION_ALLOWED = 1; 292 293 /** Property was blocked. */ 294 public static final int PRESENTATION_RESTRICTED = 2; 295 296 /** Presentation was not specified or is unknown. */ 297 public static final int PRESENTATION_UNKNOWN = 3; 298 299 /** Property should be displayed as a pay phone. */ 300 public static final int PRESENTATION_PAYPHONE = 4; 301 302 private static final String TAG = "TelecomManager"; 303 304 private final Context mContext; 305 306 /** 307 * @hide 308 */ 309 public static TelecomManager from(Context context) { 310 return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); 311 } 312 313 /** 314 * @hide 315 */ 316 public TelecomManager(Context context) { 317 Context appContext = context.getApplicationContext(); 318 if (appContext != null) { 319 mContext = appContext; 320 } else { 321 mContext = context; 322 } 323 } 324 325 /** 326 * Return the {@link PhoneAccount} which is the user-chosen default for making outgoing phone 327 * calls with a specified URI scheme. 328 * <p> 329 * Apps must be prepared for this method to return {@code null}, indicating that there currently 330 * exists no user-chosen default {@code PhoneAccount}. 331 * <p> 332 * @param uriScheme The URI scheme. 333 * @return The {@link PhoneAccountHandle} corresponding to the user-chosen default for outgoing 334 * phone calls for a specified URI scheme. 335 * 336 * @hide 337 */ 338 public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme) { 339 try { 340 if (isServiceConnected()) { 341 return getTelecomService().getDefaultOutgoingPhoneAccount(uriScheme); 342 } 343 } catch (RemoteException e) { 344 Log.e(TAG, "Error calling ITelecomService#getDefaultOutgoingPhoneAccount", e); 345 } 346 return null; 347 } 348 349 /** 350 * Return the {@link PhoneAccount} which is the user-chosen default for making outgoing phone 351 * calls. This {@code PhoneAccount} will always be a member of the list which is returned from 352 * calling {@link #getCallCapablePhoneAccounts()} 353 * 354 * Apps must be prepared for this method to return {@code null}, indicating that there currently 355 * exists no user-chosen default {@code PhoneAccount}. 356 * 357 * @return The user outgoing phone account selected by the user. 358 * @hide 359 */ 360 public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() { 361 try { 362 if (isServiceConnected()) { 363 return getTelecomService().getUserSelectedOutgoingPhoneAccount(); 364 } 365 } catch (RemoteException e) { 366 Log.e(TAG, "Error calling ITelecomService#getUserSelectedOutgoingPhoneAccount", e); 367 } 368 return null; 369 } 370 371 /** 372 * Sets the default account for making outgoing phone calls. 373 * @hide 374 */ 375 public void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle accountHandle) { 376 try { 377 if (isServiceConnected()) { 378 getTelecomService().setUserSelectedOutgoingPhoneAccount(accountHandle); 379 } 380 } catch (RemoteException e) { 381 Log.e(TAG, "Error calling ITelecomService#setUserSelectedOutgoingPhoneAccount"); 382 } 383 } 384 385 /** 386 * Returns the current SIM call manager. Apps must be prepared for this method to return 387 * {@code null}, indicating that there currently exists no user-chosen default 388 * {@code PhoneAccount}. 389 * @return The phone account handle of the current sim call manager. 390 * @hide 391 */ 392 public PhoneAccountHandle getSimCallManager() { 393 try { 394 if (isServiceConnected()) { 395 return getTelecomService().getSimCallManager(); 396 } 397 } catch (RemoteException e) { 398 Log.e(TAG, "Error calling ITelecomService#getSimCallManager"); 399 } 400 return null; 401 } 402 403 /** 404 * Sets the SIM call manager to the specified phone account. 405 * @param accountHandle The phone account handle of the account to set as the sim call manager. 406 * @hide 407 */ 408 public void setSimCallManager(PhoneAccountHandle accountHandle) { 409 try { 410 if (isServiceConnected()) { 411 getTelecomService().setSimCallManager(accountHandle); 412 } 413 } catch (RemoteException e) { 414 Log.e(TAG, "Error calling ITelecomService#setSimCallManager"); 415 } 416 } 417 418 /** 419 * Returns the list of registered SIM call managers. 420 * @return List of registered SIM call managers. 421 * @hide 422 */ 423 public List<PhoneAccountHandle> getSimCallManagers() { 424 try { 425 if (isServiceConnected()) { 426 return getTelecomService().getSimCallManagers(); 427 } 428 } catch (RemoteException e) { 429 Log.e(TAG, "Error calling ITelecomService#getSimCallManagers"); 430 } 431 return new ArrayList<>(); 432 } 433 434 /** 435 * Returns the current connection manager. Apps must be prepared for this method to return 436 * {@code null}, indicating that there currently exists no user-chosen default 437 * {@code PhoneAccount}. 438 * 439 * @return The phone account handle of the current connection manager. 440 * @hide 441 */ 442 public PhoneAccountHandle getConnectionManager() { 443 return getSimCallManager(); 444 } 445 446 /** 447 * Returns a list of the {@link PhoneAccountHandle}s which can be used to make and receive phone 448 * calls which support the specified URI scheme. 449 * <P> 450 * For example, invoking with {@code "tel"} will find all {@link PhoneAccountHandle}s which 451 * support telephone calls (e.g. URIs such as {@code tel:555-555-1212}). Invoking with 452 * {@code "sip"} will find all {@link PhoneAccountHandle}s which support SIP calls (e.g. URIs 453 * such as {@code sip:example (at) sipexample.com}). 454 * 455 * @param uriScheme The URI scheme. 456 * @return A list of {@code PhoneAccountHandle} objects supporting the URI scheme. 457 * 458 * @hide 459 */ 460 public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme) { 461 try { 462 if (isServiceConnected()) { 463 return getTelecomService().getPhoneAccountsSupportingScheme(uriScheme); 464 } 465 } catch (RemoteException e) { 466 Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsSupportingScheme", e); 467 } 468 return new ArrayList<>(); 469 } 470 471 472 /** 473 * Return a list of {@link PhoneAccountHandle}s which can be used to make and receive phone 474 * calls. 475 * 476 * @see #EXTRA_PHONE_ACCOUNT_HANDLE 477 * @return A list of {@code PhoneAccountHandle} objects. 478 * 479 * @hide 480 */ 481 public List<PhoneAccountHandle> getCallCapablePhoneAccounts() { 482 try { 483 if (isServiceConnected()) { 484 return getTelecomService().getCallCapablePhoneAccounts(); 485 } 486 } catch (RemoteException e) { 487 Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts", e); 488 } 489 return new ArrayList<>(); 490 } 491 492 /** 493 * Determine whether the device has more than one account registered that can make and receive 494 * phone calls. 495 * 496 * @return {@code true} if the device has more than one account registered and {@code false} 497 * otherwise. 498 * @hide 499 */ 500 public boolean hasMultipleCallCapableAccounts() { 501 return getCallCapablePhoneAccounts().size() > 1; 502 } 503 504 /** 505 * Returns a list of all {@link PhoneAccount}s registered for the calling package. 506 * 507 * @return A list of {@code PhoneAccountHandle} objects. 508 * @hide 509 */ 510 public List<PhoneAccountHandle> getPhoneAccountsForPackage() { 511 try { 512 if (isServiceConnected()) { 513 return getTelecomService().getPhoneAccountsForPackage(mContext.getPackageName()); 514 } 515 } catch (RemoteException e) { 516 Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsForPackage", e); 517 } 518 return null; 519 } 520 521 /** 522 * Return the {@link PhoneAccount} for a specified {@link PhoneAccountHandle}. Object includes 523 * resources which can be used in a user interface. 524 * 525 * @param account The {@link PhoneAccountHandle}. 526 * @return The {@link PhoneAccount} object. 527 * @hide 528 */ 529 public PhoneAccount getPhoneAccount(PhoneAccountHandle account) { 530 try { 531 if (isServiceConnected()) { 532 return getTelecomService().getPhoneAccount(account); 533 } 534 } catch (RemoteException e) { 535 Log.e(TAG, "Error calling ITelecomService#getPhoneAccount", e); 536 } 537 return null; 538 } 539 540 /** 541 * Returns a count of all {@link PhoneAccount}s. 542 * 543 * @return The count of {@link PhoneAccount}s. 544 * @hide 545 */ 546 @SystemApi 547 public int getAllPhoneAccountsCount() { 548 try { 549 if (isServiceConnected()) { 550 return getTelecomService().getAllPhoneAccountsCount(); 551 } 552 } catch (RemoteException e) { 553 Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountsCount", e); 554 } 555 return 0; 556 } 557 558 /** 559 * Returns a list of all {@link PhoneAccount}s. 560 * 561 * @return All {@link PhoneAccount}s. 562 * @hide 563 */ 564 @SystemApi 565 public List<PhoneAccount> getAllPhoneAccounts() { 566 try { 567 if (isServiceConnected()) { 568 return getTelecomService().getAllPhoneAccounts(); 569 } 570 } catch (RemoteException e) { 571 Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccounts", e); 572 } 573 return Collections.EMPTY_LIST; 574 } 575 576 /** 577 * Returns a list of all {@link PhoneAccountHandle}s. 578 * 579 * @return All {@link PhoneAccountHandle}s. 580 * @hide 581 */ 582 @SystemApi 583 public List<PhoneAccountHandle> getAllPhoneAccountHandles() { 584 try { 585 if (isServiceConnected()) { 586 return getTelecomService().getAllPhoneAccountHandles(); 587 } 588 } catch (RemoteException e) { 589 Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountHandles", e); 590 } 591 return Collections.EMPTY_LIST; 592 } 593 594 /** 595 * Register a {@link PhoneAccount} for use by the system. 596 * 597 * @param account The complete {@link PhoneAccount}. 598 * @hide 599 */ 600 @SystemApi 601 public void registerPhoneAccount(PhoneAccount account) { 602 try { 603 if (isServiceConnected()) { 604 getTelecomService().registerPhoneAccount(account); 605 } 606 } catch (RemoteException e) { 607 Log.e(TAG, "Error calling ITelecomService#registerPhoneAccount", e); 608 } 609 } 610 611 /** 612 * Remove a {@link PhoneAccount} registration from the system. 613 * 614 * @param accountHandle A {@link PhoneAccountHandle} for the {@link PhoneAccount} to unregister. 615 * @hide 616 */ 617 @SystemApi 618 public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) { 619 try { 620 if (isServiceConnected()) { 621 getTelecomService().unregisterPhoneAccount(accountHandle); 622 } 623 } catch (RemoteException e) { 624 Log.e(TAG, "Error calling ITelecomService#unregisterPhoneAccount", e); 625 } 626 } 627 628 /** 629 * Remove all Accounts that belong to the calling package from the system. 630 * @hide 631 */ 632 @SystemApi 633 public void clearAccounts() { 634 try { 635 if (isServiceConnected()) { 636 getTelecomService().clearAccounts(mContext.getPackageName()); 637 } 638 } catch (RemoteException e) { 639 Log.e(TAG, "Error calling ITelecomService#clearAccounts", e); 640 } 641 } 642 643 /** 644 * @hide 645 */ 646 @SystemApi 647 public ComponentName getDefaultPhoneApp() { 648 try { 649 if (isServiceConnected()) { 650 return getTelecomService().getDefaultPhoneApp(); 651 } 652 } catch (RemoteException e) { 653 Log.e(TAG, "RemoteException attempting to get the default phone app.", e); 654 } 655 return null; 656 } 657 658 /** 659 * Returns whether there is an ongoing phone call (can be in dialing, ringing, active or holding 660 * states). 661 * <p> 662 * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} 663 * </p> 664 */ 665 @SystemApi 666 public boolean isInCall() { 667 try { 668 if (isServiceConnected()) { 669 return getTelecomService().isInCall(); 670 } 671 } catch (RemoteException e) { 672 Log.e(TAG, "RemoteException calling isInCall().", e); 673 } 674 return false; 675 } 676 677 /** 678 * Returns one of the following constants that represents the current state of Telecom: 679 * 680 * {@link TelephonyManager#CALL_STATE_RINGING} 681 * {@link TelephonyManager#CALL_STATE_OFFHOOK} 682 * {@link TelephonyManager#CALL_STATE_IDLE} 683 * @hide 684 */ 685 @SystemApi 686 public int getCallState() { 687 try { 688 if (isServiceConnected()) { 689 return getTelecomService().getCallState(); 690 } 691 } catch (RemoteException e) { 692 Log.d(TAG, "RemoteException calling getCallState().", e); 693 } 694 return TelephonyManager.CALL_STATE_IDLE; 695 } 696 697 /** 698 * Returns whether there currently exists is a ringing incoming-call. 699 * 700 * @hide 701 */ 702 @SystemApi 703 public boolean isRinging() { 704 try { 705 if (isServiceConnected()) { 706 return getTelecomService().isRinging(); 707 } 708 } catch (RemoteException e) { 709 Log.e(TAG, "RemoteException attempting to get ringing state of phone app.", e); 710 } 711 return false; 712 } 713 714 /** 715 * Ends an ongoing call. 716 * TODO: L-release - need to convert all invocations of ITelecomService#endCall to use this 717 * method (clockwork & gearhead). 718 * @hide 719 */ 720 @SystemApi 721 public boolean endCall() { 722 try { 723 if (isServiceConnected()) { 724 return getTelecomService().endCall(); 725 } 726 } catch (RemoteException e) { 727 Log.e(TAG, "Error calling ITelecomService#endCall", e); 728 } 729 return false; 730 } 731 732 /** 733 * If there is a ringing incoming call, this method accepts the call on behalf of the user. 734 * TODO: L-release - need to convert all invocation of ITelecmmService#answerRingingCall to use 735 * this method (clockwork & gearhead). 736 * 737 * @hide 738 */ 739 @SystemApi 740 public void acceptRingingCall() { 741 try { 742 if (isServiceConnected()) { 743 getTelecomService().acceptRingingCall(); 744 } 745 } catch (RemoteException e) { 746 Log.e(TAG, "Error calling ITelecomService#acceptRingingCall", e); 747 } 748 } 749 750 /** 751 * Silences the ringer if a ringing call exists. 752 * 753 * @hide 754 */ 755 @SystemApi 756 public void silenceRinger() { 757 try { 758 if (isServiceConnected()) { 759 getTelecomService().silenceRinger(); 760 } 761 } catch (RemoteException e) { 762 Log.e(TAG, "Error calling ITelecomService#silenceRinger", e); 763 } 764 } 765 766 /** 767 * Returns whether TTY is supported on this device. 768 * 769 * @hide 770 */ 771 @SystemApi 772 public boolean isTtySupported() { 773 try { 774 if (isServiceConnected()) { 775 return getTelecomService().isTtySupported(); 776 } 777 } catch (RemoteException e) { 778 Log.e(TAG, "RemoteException attempting to get TTY supported state.", e); 779 } 780 return false; 781 } 782 783 /** 784 * Returns the current TTY mode of the device. For TTY to be on the user must enable it in 785 * settings and have a wired headset plugged in. 786 * Valid modes are: 787 * - {@link TelecomManager#TTY_MODE_OFF} 788 * - {@link TelecomManager#TTY_MODE_FULL} 789 * - {@link TelecomManager#TTY_MODE_HCO} 790 * - {@link TelecomManager#TTY_MODE_VCO} 791 * @hide 792 */ 793 public int getCurrentTtyMode() { 794 try { 795 if (isServiceConnected()) { 796 return getTelecomService().getCurrentTtyMode(); 797 } 798 } catch (RemoteException e) { 799 Log.e(TAG, "RemoteException attempting to get the current TTY mode.", e); 800 } 801 return TTY_MODE_OFF; 802 } 803 804 /** 805 * Registers a new incoming call. A {@link ConnectionService} should invoke this method when it 806 * has an incoming call. The specified {@link PhoneAccountHandle} must have been registered 807 * with {@link #registerPhoneAccount}. Once invoked, this method will cause the system to bind 808 * to the {@link ConnectionService} associated with the {@link PhoneAccountHandle} and request 809 * additional information about the call (See 810 * {@link ConnectionService#onCreateIncomingConnection}) before starting the incoming call UI. 811 * 812 * @param phoneAccount A {@link PhoneAccountHandle} registered with 813 * {@link #registerPhoneAccount}. 814 * @param extras A bundle that will be passed through to 815 * {@link ConnectionService#onCreateIncomingConnection}. 816 * @hide 817 */ 818 @SystemApi 819 public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) { 820 try { 821 if (isServiceConnected()) { 822 getTelecomService().addNewIncomingCall( 823 phoneAccount, extras == null ? new Bundle() : extras); 824 } 825 } catch (RemoteException e) { 826 Log.e(TAG, "RemoteException adding a new incoming call: " + phoneAccount, e); 827 } 828 } 829 830 /** 831 * Registers a new unknown call with Telecom. This can only be called by the system Telephony 832 * service. This is invoked when Telephony detects a new unknown connection that was neither 833 * a new incoming call, nor an user-initiated outgoing call. 834 * 835 * @param phoneAccount A {@link PhoneAccountHandle} registered with 836 * {@link #registerPhoneAccount}. 837 * @param extras A bundle that will be passed through to 838 * {@link ConnectionService#onCreateIncomingConnection}. 839 * @hide 840 */ 841 @SystemApi 842 public void addNewUnknownCall(PhoneAccountHandle phoneAccount, Bundle extras) { 843 try { 844 if (isServiceConnected()) { 845 getTelecomService().addNewUnknownCall( 846 phoneAccount, extras == null ? new Bundle() : extras); 847 } 848 } catch (RemoteException e) { 849 Log.e(TAG, "RemoteException adding a new unknown call: " + phoneAccount, e); 850 } 851 } 852 853 /** 854 * Processes the specified dial string as an MMI code. 855 * MMI codes are any sequence of characters entered into the dialpad that contain a "*" or "#". 856 * Some of these sequences launch special behavior through handled by Telephony. 857 * <p> 858 * Requires that the method-caller be set as the system dialer app. 859 * </p> 860 * 861 * @param dialString The digits to dial. 862 * @return True if the digits were processed as an MMI code, false otherwise. 863 */ 864 public boolean handleMmi(String dialString) { 865 ITelecomService service = getTelecomService(); 866 if (service != null) { 867 try { 868 return service.handlePinMmi(dialString); 869 } catch (RemoteException e) { 870 Log.e(TAG, "Error calling ITelecomService#handlePinMmi", e); 871 } 872 } 873 return false; 874 } 875 876 /** 877 * Removes the missed-call notification if one is present. 878 * <p> 879 * Requires that the method-caller be set as the system dialer app. 880 * </p> 881 */ 882 public void cancelMissedCallsNotification() { 883 ITelecomService service = getTelecomService(); 884 if (service != null) { 885 try { 886 service.cancelMissedCallsNotification(); 887 } catch (RemoteException e) { 888 Log.e(TAG, "Error calling ITelecomService#cancelMissedCallsNotification", e); 889 } 890 } 891 } 892 893 /** 894 * Brings the in-call screen to the foreground if there is an ongoing call. If there is 895 * currently no ongoing call, then this method does nothing. 896 * <p> 897 * Requires that the method-caller be set as the system dialer app or have the 898 * {@link android.Manifest.permission#READ_PHONE_STATE} permission. 899 * </p> 900 * 901 * @param showDialpad Brings up the in-call dialpad as part of showing the in-call screen. 902 */ 903 public void showInCallScreen(boolean showDialpad) { 904 ITelecomService service = getTelecomService(); 905 if (service != null) { 906 try { 907 service.showInCallScreen(showDialpad); 908 } catch (RemoteException e) { 909 Log.e(TAG, "Error calling ITelecomService#showCallScreen", e); 910 } 911 } 912 } 913 914 private ITelecomService getTelecomService() { 915 return ITelecomService.Stub.asInterface(ServiceManager.getService(Context.TELECOM_SERVICE)); 916 } 917 918 private boolean isServiceConnected() { 919 boolean isConnected = getTelecomService() != null; 920 if (!isConnected) { 921 Log.w(TAG, "Telecom Service not found."); 922 } 923 return isConnected; 924 } 925 } 926