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