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