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