• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.content;
18 
19 import android.annotation.AttrRes;
20 import android.annotation.CallbackExecutor;
21 import android.annotation.CheckResult;
22 import android.annotation.ColorInt;
23 import android.annotation.ColorRes;
24 import android.annotation.DisplayContext;
25 import android.annotation.DrawableRes;
26 import android.annotation.IntDef;
27 import android.annotation.NonNull;
28 import android.annotation.Nullable;
29 import android.annotation.RequiresPermission;
30 import android.annotation.StringDef;
31 import android.annotation.StringRes;
32 import android.annotation.StyleRes;
33 import android.annotation.StyleableRes;
34 import android.annotation.SuppressLint;
35 import android.annotation.SystemApi;
36 import android.annotation.TestApi;
37 import android.annotation.UiContext;
38 import android.annotation.UserIdInt;
39 import android.app.ActivityManager;
40 import android.app.GameManager;
41 import android.app.IApplicationThread;
42 import android.app.IServiceConnection;
43 import android.app.VrManager;
44 import android.app.people.PeopleManager;
45 import android.app.time.TimeManager;
46 import android.compat.annotation.UnsupportedAppUsage;
47 import android.content.pm.ApplicationInfo;
48 import android.content.pm.PackageManager;
49 import android.content.res.AssetManager;
50 import android.content.res.ColorStateList;
51 import android.content.res.Configuration;
52 import android.content.res.Resources;
53 import android.content.res.TypedArray;
54 import android.database.DatabaseErrorHandler;
55 import android.database.sqlite.SQLiteDatabase;
56 import android.database.sqlite.SQLiteDatabase.CursorFactory;
57 import android.graphics.Bitmap;
58 import android.graphics.drawable.Drawable;
59 import android.net.Uri;
60 import android.os.Build;
61 import android.os.Bundle;
62 import android.os.Environment;
63 import android.os.Handler;
64 import android.os.HandlerExecutor;
65 import android.os.IBinder;
66 import android.os.Looper;
67 import android.os.StatFs;
68 import android.os.UserHandle;
69 import android.os.UserManager;
70 import android.os.storage.StorageManager;
71 import android.provider.MediaStore;
72 import android.telephony.TelephonyRegistryManager;
73 import android.util.AttributeSet;
74 import android.view.Display;
75 import android.view.DisplayAdjustments;
76 import android.view.View;
77 import android.view.ViewDebug;
78 import android.view.ViewGroup.LayoutParams;
79 import android.view.WindowManager;
80 import android.view.WindowManager.LayoutParams.WindowType;
81 import android.view.autofill.AutofillManager.AutofillClient;
82 import android.view.contentcapture.ContentCaptureManager.ContentCaptureClient;
83 import android.view.textclassifier.TextClassificationManager;
84 import android.window.WindowContext;
85 
86 import com.android.internal.compat.IPlatformCompat;
87 import com.android.internal.compat.IPlatformCompatNative;
88 
89 import java.io.File;
90 import java.io.FileInputStream;
91 import java.io.FileNotFoundException;
92 import java.io.FileOutputStream;
93 import java.io.IOException;
94 import java.io.InputStream;
95 import java.lang.annotation.Retention;
96 import java.lang.annotation.RetentionPolicy;
97 import java.util.List;
98 import java.util.concurrent.Executor;
99 
100 /**
101  * Interface to global information about an application environment.  This is
102  * an abstract class whose implementation is provided by
103  * the Android system.  It
104  * allows access to application-specific resources and classes, as well as
105  * up-calls for application-level operations such as launching activities,
106  * broadcasting and receiving intents, etc.
107  */
108 public abstract class Context {
109     /** @hide */
110     @IntDef(flag = true, prefix = { "MODE_" }, value = {
111             MODE_PRIVATE,
112             MODE_WORLD_READABLE,
113             MODE_WORLD_WRITEABLE,
114             MODE_APPEND,
115     })
116     @Retention(RetentionPolicy.SOURCE)
117     public @interface FileMode {}
118 
119     /** @hide */
120     @IntDef(flag = true, prefix = { "MODE_" }, value = {
121             MODE_PRIVATE,
122             MODE_WORLD_READABLE,
123             MODE_WORLD_WRITEABLE,
124             MODE_MULTI_PROCESS,
125     })
126     @Retention(RetentionPolicy.SOURCE)
127     public @interface PreferencesMode {}
128 
129     /** @hide */
130     @IntDef(flag = true, prefix = { "MODE_" }, value = {
131             MODE_PRIVATE,
132             MODE_WORLD_READABLE,
133             MODE_WORLD_WRITEABLE,
134             MODE_ENABLE_WRITE_AHEAD_LOGGING,
135             MODE_NO_LOCALIZED_COLLATORS,
136     })
137     @Retention(RetentionPolicy.SOURCE)
138     public @interface DatabaseMode {}
139 
140     /**
141      * File creation mode: the default mode, where the created file can only
142      * be accessed by the calling application (or all applications sharing the
143      * same user ID).
144      */
145     public static final int MODE_PRIVATE = 0x0000;
146 
147     /**
148      * File creation mode: allow all other applications to have read access to
149      * the created file.
150      * <p>
151      * Starting from {@link android.os.Build.VERSION_CODES#N}, attempting to use this
152      * mode throws a {@link SecurityException}.
153      *
154      * @deprecated Creating world-readable files is very dangerous, and likely
155      *             to cause security holes in applications. It is strongly
156      *             discouraged; instead, applications should use more formal
157      *             mechanism for interactions such as {@link ContentProvider},
158      *             {@link BroadcastReceiver}, and {@link android.app.Service}.
159      *             There are no guarantees that this access mode will remain on
160      *             a file, such as when it goes through a backup and restore.
161      * @see android.support.v4.content.FileProvider
162      * @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
163      */
164     @Deprecated
165     public static final int MODE_WORLD_READABLE = 0x0001;
166 
167     /**
168      * File creation mode: allow all other applications to have write access to
169      * the created file.
170      * <p>
171      * Starting from {@link android.os.Build.VERSION_CODES#N}, attempting to use this
172      * mode will throw a {@link SecurityException}.
173      *
174      * @deprecated Creating world-writable files is very dangerous, and likely
175      *             to cause security holes in applications. It is strongly
176      *             discouraged; instead, applications should use more formal
177      *             mechanism for interactions such as {@link ContentProvider},
178      *             {@link BroadcastReceiver}, and {@link android.app.Service}.
179      *             There are no guarantees that this access mode will remain on
180      *             a file, such as when it goes through a backup and restore.
181      * @see android.support.v4.content.FileProvider
182      * @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
183      */
184     @Deprecated
185     public static final int MODE_WORLD_WRITEABLE = 0x0002;
186 
187     /**
188      * File creation mode: for use with {@link #openFileOutput}, if the file
189      * already exists then write data to the end of the existing file
190      * instead of erasing it.
191      * @see #openFileOutput
192      */
193     public static final int MODE_APPEND = 0x8000;
194 
195     /**
196      * SharedPreference loading flag: when set, the file on disk will
197      * be checked for modification even if the shared preferences
198      * instance is already loaded in this process.  This behavior is
199      * sometimes desired in cases where the application has multiple
200      * processes, all writing to the same SharedPreferences file.
201      * Generally there are better forms of communication between
202      * processes, though.
203      *
204      * <p>This was the legacy (but undocumented) behavior in and
205      * before Gingerbread (Android 2.3) and this flag is implied when
206      * targeting such releases.  For applications targeting SDK
207      * versions <em>greater than</em> Android 2.3, this flag must be
208      * explicitly set if desired.
209      *
210      * @see #getSharedPreferences
211      *
212      * @deprecated MODE_MULTI_PROCESS does not work reliably in
213      * some versions of Android, and furthermore does not provide any
214      * mechanism for reconciling concurrent modifications across
215      * processes.  Applications should not attempt to use it.  Instead,
216      * they should use an explicit cross-process data management
217      * approach such as {@link android.content.ContentProvider ContentProvider}.
218      */
219     @Deprecated
220     public static final int MODE_MULTI_PROCESS = 0x0004;
221 
222     /**
223      * Database open flag: when set, the database is opened with write-ahead
224      * logging enabled by default.
225      *
226      * @see #openOrCreateDatabase(String, int, CursorFactory)
227      * @see #openOrCreateDatabase(String, int, CursorFactory, DatabaseErrorHandler)
228      * @see SQLiteDatabase#enableWriteAheadLogging
229      */
230     public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 0x0008;
231 
232     /**
233      * Database open flag: when set, the database is opened without support for
234      * localized collators.
235      *
236      * @see #openOrCreateDatabase(String, int, CursorFactory)
237      * @see #openOrCreateDatabase(String, int, CursorFactory, DatabaseErrorHandler)
238      * @see SQLiteDatabase#NO_LOCALIZED_COLLATORS
239      */
240     public static final int MODE_NO_LOCALIZED_COLLATORS = 0x0010;
241 
242     /** @hide */
243     @IntDef(flag = true, prefix = { "BIND_" }, value = {
244             BIND_AUTO_CREATE,
245             BIND_DEBUG_UNBIND,
246             BIND_NOT_FOREGROUND,
247             BIND_ABOVE_CLIENT,
248             BIND_ALLOW_OOM_MANAGEMENT,
249             BIND_WAIVE_PRIORITY,
250             BIND_IMPORTANT,
251             BIND_ADJUST_WITH_ACTIVITY,
252             BIND_NOT_PERCEPTIBLE,
253             BIND_INCLUDE_CAPABILITIES
254     })
255     @Retention(RetentionPolicy.SOURCE)
256     public @interface BindServiceFlags {}
257 
258     /**
259      * Flag for {@link #bindService}: automatically create the service as long
260      * as the binding exists.  Note that while this will create the service,
261      * its {@link android.app.Service#onStartCommand}
262      * method will still only be called due to an
263      * explicit call to {@link #startService}.  Even without that, though,
264      * this still provides you with access to the service object while the
265      * service is created.
266      *
267      * <p>Note that prior to {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH},
268      * not supplying this flag would also impact how important the system
269      * consider's the target service's process to be.  When set, the only way
270      * for it to be raised was by binding from a service in which case it will
271      * only be important when that activity is in the foreground.  Now to
272      * achieve this behavior you must explicitly supply the new flag
273      * {@link #BIND_ADJUST_WITH_ACTIVITY}.  For compatibility, old applications
274      * that don't specify {@link #BIND_AUTO_CREATE} will automatically have
275      * the flags {@link #BIND_WAIVE_PRIORITY} and
276      * {@link #BIND_ADJUST_WITH_ACTIVITY} set for them in order to achieve
277      * the same result.
278      */
279     public static final int BIND_AUTO_CREATE = 0x0001;
280 
281     /**
282      * Flag for {@link #bindService}: include debugging help for mismatched
283      * calls to unbind.  When this flag is set, the callstack of the following
284      * {@link #unbindService} call is retained, to be printed if a later
285      * incorrect unbind call is made.  Note that doing this requires retaining
286      * information about the binding that was made for the lifetime of the app,
287      * resulting in a leak -- this should only be used for debugging.
288      */
289     public static final int BIND_DEBUG_UNBIND = 0x0002;
290 
291     /**
292      * Flag for {@link #bindService}: don't allow this binding to raise
293      * the target service's process to the foreground scheduling priority.
294      * It will still be raised to at least the same memory priority
295      * as the client (so that its process will not be killable in any
296      * situation where the client is not killable), but for CPU scheduling
297      * purposes it may be left in the background.  This only has an impact
298      * in the situation where the binding client is a foreground process
299      * and the target service is in a background process.
300      */
301     public static final int BIND_NOT_FOREGROUND = 0x0004;
302 
303     /**
304      * Flag for {@link #bindService}: indicates that the client application
305      * binding to this service considers the service to be more important than
306      * the app itself.  When set, the platform will try to have the out of
307      * memory killer kill the app before it kills the service it is bound to, though
308      * this is not guaranteed to be the case.
309      */
310     public static final int BIND_ABOVE_CLIENT = 0x0008;
311 
312     /**
313      * Flag for {@link #bindService}: allow the process hosting the bound
314      * service to go through its normal memory management.  It will be
315      * treated more like a running service, allowing the system to
316      * (temporarily) expunge the process if low on memory or for some other
317      * whim it may have, and being more aggressive about making it a candidate
318      * to be killed (and restarted) if running for a long time.
319      */
320     public static final int BIND_ALLOW_OOM_MANAGEMENT = 0x0010;
321 
322     /**
323      * Flag for {@link #bindService}: don't impact the scheduling or
324      * memory management priority of the target service's hosting process.
325      * Allows the service's process to be managed on the background LRU list
326      * just like a regular application process in the background.
327      */
328     public static final int BIND_WAIVE_PRIORITY = 0x0020;
329 
330     /**
331      * Flag for {@link #bindService}: this service is very important to
332      * the client, so should be brought to the foreground process level
333      * when the client is.  Normally a process can only be raised to the
334      * visibility level by a client, even if that client is in the foreground.
335      */
336     public static final int BIND_IMPORTANT = 0x0040;
337 
338     /**
339      * Flag for {@link #bindService}: If binding from an activity, allow the
340      * target service's process importance to be raised based on whether the
341      * activity is visible to the user, regardless whether another flag is
342      * used to reduce the amount that the client process's overall importance
343      * is used to impact it.
344      */
345     public static final int BIND_ADJUST_WITH_ACTIVITY = 0x0080;
346 
347     /**
348      * Flag for {@link #bindService}: If binding from an app that is visible or user-perceptible,
349      * lower the target service's importance to below the perceptible level. This allows
350      * the system to (temporarily) expunge the bound process from memory to make room for more
351      * important user-perceptible processes.
352      */
353     public static final int BIND_NOT_PERCEPTIBLE = 0x00000100;
354 
355     /**
356      * Flag for {@link #bindService}: If binding from an app that has specific capabilities
357      * due to its foreground state such as an activity or foreground service, then this flag will
358      * allow the bound app to get the same capabilities, as long as it has the required permissions
359      * as well.
360      *
361      * If binding from a top app and its target SDK version is at or above
362      * {@link android.os.Build.VERSION_CODES#R}, the app needs to
363      * explicitly use BIND_INCLUDE_CAPABILITIES flag to pass all capabilities to the service so the
364      * other app can have while-use-use access such as location, camera, microphone from background.
365      * If binding from a top app and its target SDK version is below
366      * {@link android.os.Build.VERSION_CODES#R}, BIND_INCLUDE_CAPABILITIES is implicit.
367      */
368     public static final int BIND_INCLUDE_CAPABILITIES = 0x000001000;
369 
370     /***********    Public flags above this line ***********/
371     /***********    Hidden flags below this line ***********/
372 
373     /**
374      * Flag for {@link #bindService}: This flag is only intended to be used by the system to
375      * indicate that a service binding is not considered as real package component usage and should
376      * not generate a {@link android.app.usage.UsageEvents.Event#APP_COMPONENT_USED} event in usage
377      * stats.
378      * @hide
379      */
380     public static final int BIND_NOT_APP_COMPONENT_USAGE = 0x00008000;
381 
382     /**
383      * Flag for {@link #bindService}: allow the process hosting the target service to be treated
384      * as if it's as important as a perceptible app to the user and avoid the oom killer killing
385      * this process in low memory situations until there aren't any other processes left but the
386      * ones which are user-perceptible.
387      *
388      * @hide
389      */
390     public static final int BIND_ALMOST_PERCEPTIBLE = 0x000010000;
391 
392     /**
393      * Flag for {@link #bindService}: allow the process hosting the target service to gain
394      * {@link ActivityManager#PROCESS_CAPABILITY_NETWORK}, which allows it be able
395      * to access network regardless of any power saving restrictions.
396      *
397      * @hide
398      */
399     public static final int BIND_BYPASS_POWER_NETWORK_RESTRICTIONS = 0x00020000;
400 
401     /**
402      * Do not use. This flag is no longer needed nor used.
403      * @hide
404      */
405     @SystemApi
406     public static final int BIND_ALLOW_FOREGROUND_SERVICE_STARTS_FROM_BACKGROUND = 0x00040000;
407 
408     /**
409      * Flag for {@link #bindService}: This flag is intended to be used only by the system to adjust
410      * the scheduling policy for IMEs (and any other out-of-process user-visible components that
411      * work closely with the top app) so that UI hosted in such services can have the same
412      * scheduling policy (e.g. SCHED_FIFO when it is enabled and TOP_APP_PRIORITY_BOOST otherwise)
413      * as the actual top-app.
414      * @hide
415      */
416     public static final int BIND_SCHEDULE_LIKE_TOP_APP = 0x00080000;
417 
418     /**
419      * Flag for {@link #bindService}: allow background activity starts from the bound service's
420      * process.
421      * This flag is only respected if the caller is holding
422      * {@link android.Manifest.permission#START_ACTIVITIES_FROM_BACKGROUND}.
423      * @hide
424      */
425     @SystemApi
426     public static final int BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS = 0x00100000;
427 
428     /**
429      * @hide Flag for {@link #bindService}: the service being bound to represents a
430      * protected system component, so must have association restrictions applied to it.
431      * That is, a system config must have one or more allow-association tags limiting
432      * which packages it can interact with.  If it does not have any such association
433      * restrictions, a default empty set will be created.
434      */
435     public static final int BIND_RESTRICT_ASSOCIATIONS = 0x00200000;
436 
437     /**
438      * @hide Flag for {@link #bindService}: allows binding to a service provided
439      * by an instant app. Note that the caller may not have access to the instant
440      * app providing the service which is a violation of the instant app sandbox.
441      * This flag is intended ONLY for development/testing and should be used with
442      * great care. Only the system is allowed to use this flag.
443      */
444     public static final int BIND_ALLOW_INSTANT = 0x00400000;
445 
446     /**
447      * @hide Flag for {@link #bindService}: like {@link #BIND_NOT_FOREGROUND}, but puts it
448      * up in to the important background state (instead of transient).
449      */
450     public static final int BIND_IMPORTANT_BACKGROUND = 0x00800000;
451 
452     /**
453      * @hide Flag for {@link #bindService}: allows application hosting service to manage whitelists
454      * such as temporary allowing a {@code PendingIntent} to bypass Power Save mode.
455      */
456     public static final int BIND_ALLOW_WHITELIST_MANAGEMENT = 0x01000000;
457 
458     /**
459      * @hide Flag for {@link #bindService}: Like {@link #BIND_FOREGROUND_SERVICE},
460      * but only applies while the device is awake.
461      */
462     public static final int BIND_FOREGROUND_SERVICE_WHILE_AWAKE = 0x02000000;
463 
464     /**
465      * @hide Flag for {@link #bindService}: For only the case where the binding
466      * is coming from the system, set the process state to FOREGROUND_SERVICE
467      * instead of the normal maximum of IMPORTANT_FOREGROUND.  That is, this is
468      * saying that the process shouldn't participate in the normal power reduction
469      * modes (removing network access etc).
470      */
471     public static final int BIND_FOREGROUND_SERVICE = 0x04000000;
472 
473     /**
474      * @hide Flag for {@link #bindService}: Treat the binding as hosting
475      * an activity, an unbinding as the activity going in the background.
476      * That is, when unbinding, the process when empty will go on the activity
477      * LRU list instead of the regular one, keeping it around more aggressively
478      * than it otherwise would be.  This is intended for use with IMEs to try
479      * to keep IME processes around for faster keyboard switching.
480      */
481     public static final int BIND_TREAT_LIKE_ACTIVITY = 0x08000000;
482 
483     /**
484      * @hide An idea that is not yet implemented.
485      * Flag for {@link #bindService}: If binding from an activity, consider
486      * this service to be visible like the binding activity is.  That is,
487      * it will be treated as something more important to keep around than
488      * invisible background activities.  This will impact the number of
489      * recent activities the user can switch between without having them
490      * restart.  There is no guarantee this will be respected, as the system
491      * tries to balance such requests from one app vs. the importance of
492      * keeping other apps around.
493      */
494     public static final int BIND_VISIBLE = 0x10000000;
495 
496     /**
497      * @hide
498      * Flag for {@link #bindService}: Consider this binding to be causing the target
499      * process to be showing UI, so it will be do a UI_HIDDEN memory trim when it goes
500      * away.
501      */
502     public static final int BIND_SHOWING_UI = 0x20000000;
503 
504     /**
505      * Flag for {@link #bindService}: Don't consider the bound service to be
506      * visible, even if the caller is visible.
507      * @hide
508      */
509     public static final int BIND_NOT_VISIBLE = 0x40000000;
510 
511     /**
512      * Flag for {@link #bindService}: The service being bound is an
513      * {@link android.R.attr#isolatedProcess isolated},
514      * {@link android.R.attr#externalService external} service.  This binds the service into the
515      * calling application's package, rather than the package in which the service is declared.
516      * <p>
517      * When using this flag, the code for the service being bound will execute under the calling
518      * application's package name and user ID.  Because the service must be an isolated process,
519      * it will not have direct access to the application's data, though.
520      *
521      * The purpose of this flag is to allow applications to provide services that are attributed
522      * to the app using the service, rather than the application providing the service.
523      * </p>
524      */
525     public static final int BIND_EXTERNAL_SERVICE = 0x80000000;
526 
527     /**
528      * These bind flags reduce the strength of the binding such that we shouldn't
529      * consider it as pulling the process up to the level of the one that is bound to it.
530      * @hide
531      */
532     public static final int BIND_REDUCTION_FLAGS =
533             Context.BIND_ALLOW_OOM_MANAGEMENT | Context.BIND_WAIVE_PRIORITY
534                     | Context.BIND_NOT_PERCEPTIBLE | Context.BIND_NOT_VISIBLE;
535 
536     /** @hide */
537     @IntDef(flag = true, prefix = { "RECEIVER_VISIBLE_" }, value = {
538             RECEIVER_VISIBLE_TO_INSTANT_APPS
539     })
540     @Retention(RetentionPolicy.SOURCE)
541     public @interface RegisterReceiverFlags {}
542 
543     /**
544      * Flag for {@link #registerReceiver}: The receiver can receive broadcasts from Instant Apps.
545      */
546     public static final int RECEIVER_VISIBLE_TO_INSTANT_APPS = 0x1;
547 
548     /**
549      * Returns an AssetManager instance for the application's package.
550      * <p>
551      * <strong>Note:</strong> Implementations of this method should return
552      * an AssetManager instance that is consistent with the Resources instance
553      * returned by {@link #getResources()}. For example, they should share the
554      * same {@link Configuration} object.
555      *
556      * @return an AssetManager instance for the application's package
557      * @see #getResources()
558      */
getAssets()559     public abstract AssetManager getAssets();
560 
561     /**
562      * Returns a Resources instance for the application's package.
563      * <p>
564      * <strong>Note:</strong> Implementations of this method should return
565      * a Resources instance that is consistent with the AssetManager instance
566      * returned by {@link #getAssets()}. For example, they should share the
567      * same {@link Configuration} object.
568      *
569      * @return a Resources instance for the application's package
570      * @see #getAssets()
571      */
getResources()572     public abstract Resources getResources();
573 
574     /** Return PackageManager instance to find global package information. */
getPackageManager()575     public abstract PackageManager getPackageManager();
576 
577     /** Return a ContentResolver instance for your application's package. */
getContentResolver()578     public abstract ContentResolver getContentResolver();
579 
580     /**
581      * Return the Looper for the main thread of the current process.  This is
582      * the thread used to dispatch calls to application components (activities,
583      * services, etc).
584      * <p>
585      * By definition, this method returns the same result as would be obtained
586      * by calling {@link Looper#getMainLooper() Looper.getMainLooper()}.
587      * </p>
588      *
589      * @return The main looper.
590      */
getMainLooper()591     public abstract Looper getMainLooper();
592 
593     /**
594      * Return an {@link Executor} that will run enqueued tasks on the main
595      * thread associated with this context. This is the thread used to dispatch
596      * calls to application components (activities, services, etc).
597      */
getMainExecutor()598     public Executor getMainExecutor() {
599         // This is pretty inefficient, which is why ContextImpl overrides it
600         return new HandlerExecutor(new Handler(getMainLooper()));
601     }
602 
603     /**
604      * Return the context of the single, global Application object of the
605      * current process.  This generally should only be used if you need a
606      * Context whose lifecycle is separate from the current context, that is
607      * tied to the lifetime of the process rather than the current component.
608      *
609      * <p>Consider for example how this interacts with
610      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)}:
611      * <ul>
612      * <li> <p>If used from an Activity context, the receiver is being registered
613      * within that activity.  This means that you are expected to unregister
614      * before the activity is done being destroyed; in fact if you do not do
615      * so, the framework will clean up your leaked registration as it removes
616      * the activity and log an error.  Thus, if you use the Activity context
617      * to register a receiver that is static (global to the process, not
618      * associated with an Activity instance) then that registration will be
619      * removed on you at whatever point the activity you used is destroyed.
620      * <li> <p>If used from the Context returned here, the receiver is being
621      * registered with the global state associated with your application.  Thus
622      * it will never be unregistered for you.  This is necessary if the receiver
623      * is associated with static data, not a particular component.  However
624      * using the ApplicationContext elsewhere can easily lead to serious leaks
625      * if you forget to unregister, unbind, etc.
626      * </ul>
627      */
getApplicationContext()628     public abstract Context getApplicationContext();
629 
630     /** Non-activity related autofill ids are unique in the app */
631     private static int sLastAutofillId = View.NO_ID;
632 
633     /**
634      * Gets the next autofill ID.
635      *
636      * <p>All IDs will be smaller or the same as {@link View#LAST_APP_AUTOFILL_ID}. All IDs
637      * returned will be unique.
638      *
639      * @return A ID that is unique in the process
640      *
641      * {@hide}
642      */
getNextAutofillId()643     public int getNextAutofillId() {
644         if (sLastAutofillId == View.LAST_APP_AUTOFILL_ID - 1) {
645             sLastAutofillId = View.NO_ID;
646         }
647 
648         sLastAutofillId++;
649 
650         return sLastAutofillId;
651     }
652 
653     /**
654      * Add a new {@link ComponentCallbacks} to the base application of the
655      * Context, which will be called at the same times as the ComponentCallbacks
656      * methods of activities and other components are called. Note that you
657      * <em>must</em> be sure to use {@link #unregisterComponentCallbacks} when
658      * appropriate in the future; this will not be removed for you.
659      * <p>
660      * After {@link Build.VERSION_CODES#S}, Registering the ComponentCallbacks to Context created
661      * via {@link #createWindowContext(int, Bundle)} or
662      * {@link #createWindowContext(Display, int, Bundle)} will receive
663      * {@link ComponentCallbacks#onConfigurationChanged(Configuration)} from Window Context rather
664      * than its base application. It is helpful if you want to handle UI components that
665      * associated with the Window Context when the Window Context has configuration changes.</p>
666      *
667      * @param callback The interface to call.  This can be either a
668      * {@link ComponentCallbacks} or {@link ComponentCallbacks2} interface.
669      *
670      * @see Context#createWindowContext(int, Bundle)
671      */
registerComponentCallbacks(ComponentCallbacks callback)672     public void registerComponentCallbacks(ComponentCallbacks callback) {
673         getApplicationContext().registerComponentCallbacks(callback);
674     }
675 
676     /**
677      * Remove a {@link ComponentCallbacks} object that was previously registered
678      * with {@link #registerComponentCallbacks(ComponentCallbacks)}.
679      */
unregisterComponentCallbacks(ComponentCallbacks callback)680     public void unregisterComponentCallbacks(ComponentCallbacks callback) {
681         getApplicationContext().unregisterComponentCallbacks(callback);
682     }
683 
684     /**
685      * Return a localized, styled CharSequence from the application's package's
686      * default string table.
687      *
688      * @param resId Resource id for the CharSequence text
689      */
690     @NonNull
getText(@tringRes int resId)691     public final CharSequence getText(@StringRes int resId) {
692         return getResources().getText(resId);
693     }
694 
695     /**
696      * Returns a localized string from the application's package's
697      * default string table.
698      *
699      * @param resId Resource id for the string
700      * @return The string data associated with the resource, stripped of styled
701      *         text information.
702      */
703     @NonNull
getString(@tringRes int resId)704     public final String getString(@StringRes int resId) {
705         return getResources().getString(resId);
706     }
707 
708     /**
709      * Returns a localized formatted string from the application's package's
710      * default string table, substituting the format arguments as defined in
711      * {@link java.util.Formatter} and {@link java.lang.String#format}.
712      *
713      * @param resId Resource id for the format string
714      * @param formatArgs The format arguments that will be used for
715      *                   substitution.
716      * @return The string data associated with the resource, formatted and
717      *         stripped of styled text information.
718      */
719     @NonNull
getString(@tringRes int resId, Object... formatArgs)720     public final String getString(@StringRes int resId, Object... formatArgs) {
721         return getResources().getString(resId, formatArgs);
722     }
723 
724     /**
725      * Returns a color associated with a particular resource ID and styled for
726      * the current theme.
727      *
728      * @param id The desired resource identifier, as generated by the aapt
729      *           tool. This integer encodes the package, type, and resource
730      *           entry. The value 0 is an invalid identifier.
731      * @return A single color value in the form 0xAARRGGBB.
732      * @throws android.content.res.Resources.NotFoundException if the given ID
733      *         does not exist.
734      */
735     @ColorInt
getColor(@olorRes int id)736     public final int getColor(@ColorRes int id) {
737         return getResources().getColor(id, getTheme());
738     }
739 
740     /**
741      * Returns a drawable object associated with a particular resource ID and
742      * styled for the current theme.
743      *
744      * @param id The desired resource identifier, as generated by the aapt
745      *           tool. This integer encodes the package, type, and resource
746      *           entry. The value 0 is an invalid identifier.
747      * @return An object that can be used to draw this resource.
748      * @throws android.content.res.Resources.NotFoundException if the given ID
749      *         does not exist.
750      */
751     @Nullable
getDrawable(@rawableRes int id)752     public final Drawable getDrawable(@DrawableRes int id) {
753         return getResources().getDrawable(id, getTheme());
754     }
755 
756     /**
757      * Returns a color state list associated with a particular resource ID and
758      * styled for the current theme.
759      *
760      * @param id The desired resource identifier, as generated by the aapt
761      *           tool. This integer encodes the package, type, and resource
762      *           entry. The value 0 is an invalid identifier.
763      * @return A color state list.
764      * @throws android.content.res.Resources.NotFoundException if the given ID
765      *         does not exist.
766      */
767     @NonNull
getColorStateList(@olorRes int id)768     public final ColorStateList getColorStateList(@ColorRes int id) {
769         return getResources().getColorStateList(id, getTheme());
770     }
771 
772      /**
773      * Set the base theme for this context.  Note that this should be called
774      * before any views are instantiated in the Context (for example before
775      * calling {@link android.app.Activity#setContentView} or
776      * {@link android.view.LayoutInflater#inflate}).
777      *
778      * @param resid The style resource describing the theme.
779      */
setTheme(@tyleRes int resid)780     public abstract void setTheme(@StyleRes int resid);
781 
782     /** @hide Needed for some internal implementation...  not public because
783      * you can't assume this actually means anything. */
784     @UnsupportedAppUsage
getThemeResId()785     public int getThemeResId() {
786         return 0;
787     }
788 
789     /**
790      * Return the Theme object associated with this Context.
791      */
792     @ViewDebug.ExportedProperty(deepExport = true)
getTheme()793     public abstract Resources.Theme getTheme();
794 
795     /**
796      * Retrieve styled attribute information in this Context's theme.  See
797      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(int[])}
798      * for more information.
799      *
800      * @see android.content.res.Resources.Theme#obtainStyledAttributes(int[])
801      */
802     @NonNull
obtainStyledAttributes(@onNull @tyleableRes int[] attrs)803     public final TypedArray obtainStyledAttributes(@NonNull @StyleableRes int[] attrs) {
804         return getTheme().obtainStyledAttributes(attrs);
805     }
806 
807     /**
808      * Retrieve styled attribute information in this Context's theme.  See
809      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(int, int[])}
810      * for more information.
811      *
812      * @see android.content.res.Resources.Theme#obtainStyledAttributes(int, int[])
813      */
814     @NonNull
obtainStyledAttributes(@tyleRes int resid, @NonNull @StyleableRes int[] attrs)815     public final TypedArray obtainStyledAttributes(@StyleRes int resid,
816             @NonNull @StyleableRes int[] attrs) throws Resources.NotFoundException {
817         return getTheme().obtainStyledAttributes(resid, attrs);
818     }
819 
820     /**
821      * Retrieve styled attribute information in this Context's theme.  See
822      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}
823      * for more information.
824      *
825      * @see android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)
826      */
827     @NonNull
obtainStyledAttributes( @ullable AttributeSet set, @NonNull @StyleableRes int[] attrs)828     public final TypedArray obtainStyledAttributes(
829             @Nullable AttributeSet set, @NonNull @StyleableRes int[] attrs) {
830         return getTheme().obtainStyledAttributes(set, attrs, 0, 0);
831     }
832 
833     /**
834      * Retrieve styled attribute information in this Context's theme.  See
835      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}
836      * for more information.
837      *
838      * @see android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)
839      */
840     @NonNull
obtainStyledAttributes(@ullable AttributeSet set, @NonNull @StyleableRes int[] attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)841     public final TypedArray obtainStyledAttributes(@Nullable AttributeSet set,
842             @NonNull @StyleableRes int[] attrs, @AttrRes int defStyleAttr,
843             @StyleRes int defStyleRes) {
844         return getTheme().obtainStyledAttributes(
845             set, attrs, defStyleAttr, defStyleRes);
846     }
847 
848     /**
849      * Return a class loader you can use to retrieve classes in this package.
850      */
getClassLoader()851     public abstract ClassLoader getClassLoader();
852 
853     /** Return the name of this application's package. */
getPackageName()854     public abstract String getPackageName();
855 
856     /**
857      * @hide Return the name of the base context this context is derived from.
858      * This is the same as {@link #getOpPackageName()} except in
859      * cases where system components are loaded into other app processes, in which
860      * case {@link #getOpPackageName()} will be the name of the primary package in
861      * that process (so that app ops uid verification will work with the name).
862      */
863     @SuppressWarnings("HiddenAbstractMethod")
864     @UnsupportedAppUsage
getBasePackageName()865     public abstract String getBasePackageName();
866 
867     /**
868      * Return the package name that should be used for {@link android.app.AppOpsManager} calls from
869      * this context, so that app ops manager's uid verification will work with the name.
870      * <p>
871      * This is not generally intended for third party application developers.
872      */
873     @NonNull
getOpPackageName()874     public String getOpPackageName() {
875         throw new RuntimeException("Not implemented. Must override in a subclass.");
876     }
877 
878     /**
879      * <p>Attribution can be used in complex apps to logically separate parts of the app. E.g. a
880      * blogging app might also have a instant messaging app built in. In this case two separate tags
881      * can for used each sub-feature.
882      *
883      * @return the attribution tag this context is for or {@code null} if this is the default.
884      */
getAttributionTag()885     public @Nullable String getAttributionTag() {
886         return null;
887     }
888 
889     /**
890      * @return The identity of this context for permission purposes.
891      *
892      * @see AttributionSource
893      */
getAttributionSource()894     public @NonNull AttributionSource getAttributionSource() {
895         return null;
896     }
897 
898     // TODO moltmann: Remove
899     /**
900      * @removed
901      */
902     @Deprecated
getFeatureId()903     public @Nullable String getFeatureId() {
904         return getAttributionTag();
905     }
906 
907     /**
908      * Return the set of parameters which this Context was created with, if it
909      * was created via {@link #createContext(ContextParams)}.
910      */
getParams()911     public @Nullable ContextParams getParams() {
912         return null;
913     }
914 
915     /** Return the full application info for this context's package. */
getApplicationInfo()916     public abstract ApplicationInfo getApplicationInfo();
917 
918     /**
919      * Return the full path to this context's primary Android package.
920      * The Android package is a ZIP file which contains the application's
921      * primary resources.
922      *
923      * <p>Note: this is not generally useful for applications, since they should
924      * not be directly accessing the file system.
925      *
926      * @return String Path to the resources.
927      */
getPackageResourcePath()928     public abstract String getPackageResourcePath();
929 
930     /**
931      * Return the full path to this context's primary Android package.
932      * The Android package is a ZIP file which contains application's
933      * primary code and assets.
934      *
935      * <p>Note: this is not generally useful for applications, since they should
936      * not be directly accessing the file system.
937      *
938      * @return String Path to the code and assets.
939      */
getPackageCodePath()940     public abstract String getPackageCodePath();
941 
942     /**
943      * @hide
944      * @deprecated use {@link #getSharedPreferencesPath(String)}
945      */
946     @Deprecated
947     @UnsupportedAppUsage
getSharedPrefsFile(String name)948     public File getSharedPrefsFile(String name) {
949         return getSharedPreferencesPath(name);
950     }
951 
952     /**
953      * Retrieve and hold the contents of the preferences file 'name', returning
954      * a SharedPreferences through which you can retrieve and modify its
955      * values.  Only one instance of the SharedPreferences object is returned
956      * to any callers for the same name, meaning they will see each other's
957      * edits as soon as they are made.
958      *
959      * <p>This method is thread-safe.
960      *
961      * <p>If the preferences directory does not already exist, it will be created when this method
962      * is called.
963      *
964      * <p>If a preferences file by this name does not exist, it will be created when you retrieve an
965      * editor ({@link SharedPreferences#edit()}) and then commit changes ({@link
966      * SharedPreferences.Editor#commit()} or {@link SharedPreferences.Editor#apply()}).
967      *
968      * @param name Desired preferences file.
969      * @param mode Operating mode.
970      *
971      * @return The single {@link SharedPreferences} instance that can be used
972      *         to retrieve and modify the preference values.
973      *
974      * @see #MODE_PRIVATE
975      */
getSharedPreferences(String name, @PreferencesMode int mode)976     public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);
977 
978     /**
979      * Retrieve and hold the contents of the preferences file, returning
980      * a SharedPreferences through which you can retrieve and modify its
981      * values.  Only one instance of the SharedPreferences object is returned
982      * to any callers for the same name, meaning they will see each other's
983      * edits as soon as they are made.
984      *
985      * @param file Desired preferences file. If a preferences file by this name
986      * does not exist, it will be created when you retrieve an
987      * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
988      * @param mode Operating mode.
989      *
990      * @return The single {@link SharedPreferences} instance that can be used
991      *         to retrieve and modify the preference values.
992      *
993      * @see #getSharedPreferencesPath(String)
994      * @see #MODE_PRIVATE
995      * @removed
996      */
997     @SuppressWarnings("HiddenAbstractMethod")
getSharedPreferences(File file, @PreferencesMode int mode)998     public abstract SharedPreferences getSharedPreferences(File file, @PreferencesMode int mode);
999 
1000     /**
1001      * Move an existing shared preferences file from the given source storage
1002      * context to this context. This is typically used to migrate data between
1003      * storage locations after an upgrade, such as moving to device protected
1004      * storage.
1005      *
1006      * @param sourceContext The source context which contains the existing
1007      *            shared preferences to move.
1008      * @param name The name of the shared preferences file.
1009      * @return {@code true} if the move was successful or if the shared
1010      *         preferences didn't exist in the source context, otherwise
1011      *         {@code false}.
1012      * @see #createDeviceProtectedStorageContext()
1013      */
moveSharedPreferencesFrom(Context sourceContext, String name)1014     public abstract boolean moveSharedPreferencesFrom(Context sourceContext, String name);
1015 
1016     /**
1017      * Delete an existing shared preferences file.
1018      *
1019      * @param name The name (unique in the application package) of the shared
1020      *            preferences file.
1021      * @return {@code true} if the shared preferences file was successfully
1022      *         deleted; else {@code false}.
1023      * @see #getSharedPreferences(String, int)
1024      */
deleteSharedPreferences(String name)1025     public abstract boolean deleteSharedPreferences(String name);
1026 
1027     /** @hide */
1028     @SuppressWarnings("HiddenAbstractMethod")
reloadSharedPreferences()1029     public abstract void reloadSharedPreferences();
1030 
1031     /**
1032      * Open a private file associated with this Context's application package
1033      * for reading.
1034      *
1035      * @param name The name of the file to open; can not contain path
1036      *             separators.
1037      *
1038      * @return The resulting {@link FileInputStream}.
1039      *
1040      * @see #openFileOutput
1041      * @see #fileList
1042      * @see #deleteFile
1043      * @see java.io.FileInputStream#FileInputStream(String)
1044      */
openFileInput(String name)1045     public abstract FileInputStream openFileInput(String name)
1046         throws FileNotFoundException;
1047 
1048     /**
1049      * Open a private file associated with this Context's application package
1050      * for writing. Creates the file if it doesn't already exist.
1051      * <p>
1052      * No additional permissions are required for the calling app to read or
1053      * write the returned file.
1054      *
1055      * @param name The name of the file to open; can not contain path
1056      *            separators.
1057      * @param mode Operating mode.
1058      * @return The resulting {@link FileOutputStream}.
1059      * @see #MODE_APPEND
1060      * @see #MODE_PRIVATE
1061      * @see #openFileInput
1062      * @see #fileList
1063      * @see #deleteFile
1064      * @see java.io.FileOutputStream#FileOutputStream(String)
1065      */
openFileOutput(String name, @FileMode int mode)1066     public abstract FileOutputStream openFileOutput(String name, @FileMode int mode)
1067         throws FileNotFoundException;
1068 
1069     /**
1070      * Delete the given private file associated with this Context's
1071      * application package.
1072      *
1073      * @param name The name of the file to delete; can not contain path
1074      *             separators.
1075      *
1076      * @return {@code true} if the file was successfully deleted; else
1077      *         {@code false}.
1078      *
1079      * @see #openFileInput
1080      * @see #openFileOutput
1081      * @see #fileList
1082      * @see java.io.File#delete()
1083      */
deleteFile(String name)1084     public abstract boolean deleteFile(String name);
1085 
1086     /**
1087      * Returns the absolute path on the filesystem where a file created with
1088      * {@link #openFileOutput} is stored.
1089      * <p>
1090      * The returned path may change over time if the calling app is moved to an
1091      * adopted storage device, so only relative paths should be persisted.
1092      *
1093      * @param name The name of the file for which you would like to get
1094      *          its path.
1095      *
1096      * @return An absolute path to the given file.
1097      *
1098      * @see #openFileOutput
1099      * @see #getFilesDir
1100      * @see #getDir
1101      */
getFileStreamPath(String name)1102     public abstract File getFileStreamPath(String name);
1103 
1104     /**
1105      * Returns the absolute path on the filesystem where a file created with
1106      * {@link #getSharedPreferences(String, int)} is stored.
1107      * <p>
1108      * The returned path may change over time if the calling app is moved to an
1109      * adopted storage device, so only relative paths should be persisted.
1110      *
1111      * @param name The name of the shared preferences for which you would like
1112      *            to get a path.
1113      * @return An absolute path to the given file.
1114      * @see #getSharedPreferences(String, int)
1115      * @removed
1116      */
1117     @SuppressWarnings("HiddenAbstractMethod")
getSharedPreferencesPath(String name)1118     public abstract File getSharedPreferencesPath(String name);
1119 
1120     /**
1121      * Returns the absolute path to the directory on the filesystem where all
1122      * private files belonging to this app are stored. Apps should not use this
1123      * path directly; they should instead use {@link #getFilesDir()},
1124      * {@link #getCacheDir()}, {@link #getDir(String, int)}, or other storage
1125      * APIs on this class.
1126      * <p>
1127      * The returned path may change over time if the calling app is moved to an
1128      * adopted storage device, so only relative paths should be persisted.
1129      * <p>
1130      * No additional permissions are required for the calling app to read or
1131      * write files under the returned path.
1132      *
1133      * @see ApplicationInfo#dataDir
1134      */
getDataDir()1135     public abstract File getDataDir();
1136 
1137     /**
1138      * Returns the absolute path to the directory on the filesystem where files
1139      * created with {@link #openFileOutput} are stored.
1140      * <p>
1141      * The returned path may change over time if the calling app is moved to an
1142      * adopted storage device, so only relative paths should be persisted.
1143      * <p>
1144      * No additional permissions are required for the calling app to read or
1145      * write files under the returned path.
1146      *
1147      * @return The path of the directory holding application files.
1148      * @see #openFileOutput
1149      * @see #getFileStreamPath
1150      * @see #getDir
1151      */
getFilesDir()1152     public abstract File getFilesDir();
1153 
1154     /**
1155      * Returns the absolute path to the directory that is related to the crate on the filesystem.
1156      * <p>
1157      *     The crateId require a validated file name. It can't contain any "..", ".",
1158      *     {@link File#separatorChar} etc..
1159      * </p>
1160      * <p>
1161      * The returned path may change over time if the calling app is moved to an
1162      * adopted storage device, so only relative paths should be persisted.
1163      * </p>
1164      * <p>
1165      * No additional permissions are required for the calling app to read or
1166      * write files under the returned path.
1167      *</p>
1168      *
1169      * @param crateId the relative validated file name under {@link Context#getDataDir()}/crates
1170      * @return the crate directory file.
1171      * @hide
1172      */
1173     @NonNull
1174     @TestApi
getCrateDir(@onNull String crateId)1175     public File getCrateDir(@NonNull String crateId) {
1176         throw new RuntimeException("Not implemented. Must override in a subclass.");
1177     }
1178 
1179     /**
1180      * Returns the absolute path to the directory on the filesystem similar to
1181      * {@link #getFilesDir()}. The difference is that files placed under this
1182      * directory will be excluded from automatic backup to remote storage. See
1183      * {@link android.app.backup.BackupAgent BackupAgent} for a full discussion
1184      * of the automatic backup mechanism in Android.
1185      * <p>
1186      * The returned path may change over time if the calling app is moved to an
1187      * adopted storage device, so only relative paths should be persisted.
1188      * <p>
1189      * No additional permissions are required for the calling app to read or
1190      * write files under the returned path.
1191      *
1192      * @return The path of the directory holding application files that will not
1193      *         be automatically backed up to remote storage.
1194      * @see #openFileOutput
1195      * @see #getFileStreamPath
1196      * @see #getDir
1197      * @see android.app.backup.BackupAgent
1198      */
getNoBackupFilesDir()1199     public abstract File getNoBackupFilesDir();
1200 
1201     /**
1202      * Returns the absolute path to the directory on the primary shared/external
1203      * storage device where the application can place persistent files it owns.
1204      * These files are internal to the applications, and not typically visible
1205      * to the user as media.
1206      * <p>
1207      * This is like {@link #getFilesDir()} in that these files will be deleted
1208      * when the application is uninstalled, however there are some important
1209      * differences:
1210      * <ul>
1211      * <li>Shared storage may not always be available, since removable media can
1212      * be ejected by the user. Media state can be checked using
1213      * {@link Environment#getExternalStorageState(File)}.
1214      * <li>There is no security enforced with these files. For example, any
1215      * application holding
1216      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
1217      * these files.
1218      * </ul>
1219      * <p>
1220      * If a shared storage device is emulated (as determined by
1221      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
1222      * backed by a private user data partition, which means there is little
1223      * benefit to storing data here instead of the private directories returned
1224      * by {@link #getFilesDir()}, etc.
1225      * <p>
1226      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
1227      * are required to read or write to the returned path; it's always
1228      * accessible to the calling app. This only applies to paths generated for
1229      * package name of the calling application. To access paths belonging to
1230      * other packages,
1231      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
1232      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
1233      * <p>
1234      * On devices with multiple users (as described by {@link UserManager}),
1235      * each user has their own isolated shared storage. Applications only have
1236      * access to the shared storage for the user they're running as.
1237      * <p>
1238      * The returned path may change over time if different shared storage media
1239      * is inserted, so only relative paths should be persisted.
1240      * <p>
1241      * Here is an example of typical code to manipulate a file in an
1242      * application's shared storage:
1243      * </p>
1244      * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java
1245      * private_file}
1246      * <p>
1247      * If you supply a non-null <var>type</var> to this function, the returned
1248      * file will be a path to a sub-directory of the given type. Though these
1249      * files are not automatically scanned by the media scanner, you can
1250      * explicitly add them to the media database with
1251      * {@link android.media.MediaScannerConnection#scanFile(Context, String[], String[], android.media.MediaScannerConnection.OnScanCompletedListener)
1252      * MediaScannerConnection.scanFile}. Note that this is not the same as
1253      * {@link android.os.Environment#getExternalStoragePublicDirectory
1254      * Environment.getExternalStoragePublicDirectory()}, which provides
1255      * directories of media shared by all applications. The directories returned
1256      * here are owned by the application, and their contents will be removed
1257      * when the application is uninstalled. Unlike
1258      * {@link android.os.Environment#getExternalStoragePublicDirectory
1259      * Environment.getExternalStoragePublicDirectory()}, the directory returned
1260      * here will be automatically created for you.
1261      * <p>
1262      * Here is an example of typical code to manipulate a picture in an
1263      * application's shared storage and add it to the media database:
1264      * </p>
1265      * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java
1266      * private_picture}
1267      *
1268      * @param type The type of files directory to return. May be {@code null}
1269      *            for the root of the files directory or one of the following
1270      *            constants for a subdirectory:
1271      *            {@link android.os.Environment#DIRECTORY_MUSIC},
1272      *            {@link android.os.Environment#DIRECTORY_PODCASTS},
1273      *            {@link android.os.Environment#DIRECTORY_RINGTONES},
1274      *            {@link android.os.Environment#DIRECTORY_ALARMS},
1275      *            {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
1276      *            {@link android.os.Environment#DIRECTORY_PICTURES}, or
1277      *            {@link android.os.Environment#DIRECTORY_MOVIES}.
1278      * @return the absolute path to application-specific directory. May return
1279      *         {@code null} if shared storage is not currently available.
1280      * @see #getFilesDir
1281      * @see #getExternalFilesDirs(String)
1282      * @see Environment#getExternalStorageState(File)
1283      * @see Environment#isExternalStorageEmulated(File)
1284      * @see Environment#isExternalStorageRemovable(File)
1285      */
1286     @Nullable
getExternalFilesDir(@ullable String type)1287     public abstract File getExternalFilesDir(@Nullable String type);
1288 
1289     /**
1290      * Returns absolute paths to application-specific directories on all
1291      * shared/external storage devices where the application can place
1292      * persistent files it owns. These files are internal to the application,
1293      * and not typically visible to the user as media.
1294      * <p>
1295      * This is like {@link #getFilesDir()} in that these files will be deleted
1296      * when the application is uninstalled, however there are some important
1297      * differences:
1298      * <ul>
1299      * <li>Shared storage may not always be available, since removable media can
1300      * be ejected by the user. Media state can be checked using
1301      * {@link Environment#getExternalStorageState(File)}.
1302      * <li>There is no security enforced with these files. For example, any
1303      * application holding
1304      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
1305      * these files.
1306      * </ul>
1307      * <p>
1308      * If a shared storage device is emulated (as determined by
1309      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
1310      * backed by a private user data partition, which means there is little
1311      * benefit to storing data here instead of the private directories returned
1312      * by {@link #getFilesDir()}, etc.
1313      * <p>
1314      * Shared storage devices returned here are considered a stable part of the
1315      * device, including physical media slots under a protective cover. The
1316      * returned paths do not include transient devices, such as USB flash drives
1317      * connected to handheld devices.
1318      * <p>
1319      * An application may store data on any or all of the returned devices. For
1320      * example, an app may choose to store large files on the device with the
1321      * most available space, as measured by {@link StatFs}.
1322      * <p>
1323      * No additional permissions are required for the calling app to read or
1324      * write files under the returned path. Write access outside of these paths
1325      * on secondary external storage devices is not available.
1326      * <p>
1327      * The returned path may change over time if different shared storage media
1328      * is inserted, so only relative paths should be persisted.
1329      *
1330      * @param type The type of files directory to return. May be {@code null}
1331      *            for the root of the files directory or one of the following
1332      *            constants for a subdirectory:
1333      *            {@link android.os.Environment#DIRECTORY_MUSIC},
1334      *            {@link android.os.Environment#DIRECTORY_PODCASTS},
1335      *            {@link android.os.Environment#DIRECTORY_RINGTONES},
1336      *            {@link android.os.Environment#DIRECTORY_ALARMS},
1337      *            {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
1338      *            {@link android.os.Environment#DIRECTORY_PICTURES}, or
1339      *            {@link android.os.Environment#DIRECTORY_MOVIES}.
1340      * @return the absolute paths to application-specific directories. Some
1341      *         individual paths may be {@code null} if that shared storage is
1342      *         not currently available. The first path returned is the same as
1343      *         {@link #getExternalFilesDir(String)}.
1344      * @see #getExternalFilesDir(String)
1345      * @see Environment#getExternalStorageState(File)
1346      * @see Environment#isExternalStorageEmulated(File)
1347      * @see Environment#isExternalStorageRemovable(File)
1348      */
getExternalFilesDirs(String type)1349     public abstract File[] getExternalFilesDirs(String type);
1350 
1351     /**
1352      * Return the primary shared/external storage directory where this
1353      * application's OBB files (if there are any) can be found. Note if the
1354      * application does not have any OBB files, this directory may not exist.
1355      * <p>
1356      * This is like {@link #getFilesDir()} in that these files will be deleted
1357      * when the application is uninstalled, however there are some important
1358      * differences:
1359      * <ul>
1360      * <li>Shared storage may not always be available, since removable media can
1361      * be ejected by the user. Media state can be checked using
1362      * {@link Environment#getExternalStorageState(File)}.
1363      * <li>There is no security enforced with these files. For example, any
1364      * application holding
1365      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
1366      * these files.
1367      * </ul>
1368      * <p>
1369      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
1370      * are required to read or write to the path that this method returns.
1371      * However, starting from {@link android.os.Build.VERSION_CODES#M},
1372      * to read the OBB expansion files, you must declare the
1373      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} permission in the app manifest and ask for
1374      * permission at runtime as follows:
1375      * </p>
1376      * <p>
1377      * {@code <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
1378      * android:maxSdkVersion="23" />}
1379      * </p>
1380      * <p>
1381      * Starting from {@link android.os.Build.VERSION_CODES#N},
1382      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
1383      * permission is not required, so don’t ask for this
1384      * permission at runtime. To handle both cases, your app must first try to read the OBB file,
1385      * and if it fails, you must request
1386      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} permission at runtime.
1387      * </p>
1388      *
1389      * <p>
1390      * The following code snippet shows how to do this:
1391      * </p>
1392      *
1393      * <pre>
1394      * File obb = new File(obb_filename);
1395      * boolean open_failed = false;
1396      *
1397      * try {
1398      *     BufferedReader br = new BufferedReader(new FileReader(obb));
1399      *     open_failed = false;
1400      *     ReadObbFile(br);
1401      * } catch (IOException e) {
1402      *     open_failed = true;
1403      * }
1404      *
1405      * if (open_failed) {
1406      *     // request READ_EXTERNAL_STORAGE permission before reading OBB file
1407      *     ReadObbFileWithPermission();
1408      * }
1409      * </pre>
1410      *
1411      * On devices with multiple users (as described by {@link UserManager}),
1412      * multiple users may share the same OBB storage location. Applications
1413      * should ensure that multiple instances running under different users don't
1414      * interfere with each other.
1415      *
1416      * @return the absolute path to application-specific directory. May return
1417      *         {@code null} if shared storage is not currently available.
1418      * @see #getObbDirs()
1419      * @see Environment#getExternalStorageState(File)
1420      * @see Environment#isExternalStorageEmulated(File)
1421      * @see Environment#isExternalStorageRemovable(File)
1422      */
getObbDir()1423     public abstract File getObbDir();
1424 
1425     /**
1426      * Returns absolute paths to application-specific directories on all
1427      * shared/external storage devices where the application's OBB files (if
1428      * there are any) can be found. Note if the application does not have any
1429      * OBB files, these directories may not exist.
1430      * <p>
1431      * This is like {@link #getFilesDir()} in that these files will be deleted
1432      * when the application is uninstalled, however there are some important
1433      * differences:
1434      * <ul>
1435      * <li>Shared storage may not always be available, since removable media can
1436      * be ejected by the user. Media state can be checked using
1437      * {@link Environment#getExternalStorageState(File)}.
1438      * <li>There is no security enforced with these files. For example, any
1439      * application holding
1440      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
1441      * these files.
1442      * </ul>
1443      * <p>
1444      * Shared storage devices returned here are considered a stable part of the
1445      * device, including physical media slots under a protective cover. The
1446      * returned paths do not include transient devices, such as USB flash drives
1447      * connected to handheld devices.
1448      * <p>
1449      * An application may store data on any or all of the returned devices. For
1450      * example, an app may choose to store large files on the device with the
1451      * most available space, as measured by {@link StatFs}.
1452      * <p>
1453      * No additional permissions are required for the calling app to read or
1454      * write files under the returned path. Write access outside of these paths
1455      * on secondary external storage devices is not available.
1456      *
1457      * @return the absolute paths to application-specific directories. Some
1458      *         individual paths may be {@code null} if that shared storage is
1459      *         not currently available. The first path returned is the same as
1460      *         {@link #getObbDir()}
1461      * @see #getObbDir()
1462      * @see Environment#getExternalStorageState(File)
1463      * @see Environment#isExternalStorageEmulated(File)
1464      * @see Environment#isExternalStorageRemovable(File)
1465      */
getObbDirs()1466     public abstract File[] getObbDirs();
1467 
1468     /**
1469      * Returns the absolute path to the application specific cache directory on
1470      * the filesystem.
1471      * <p>
1472      * The system will automatically delete files in this directory as disk
1473      * space is needed elsewhere on the device. The system will always delete
1474      * older files first, as reported by {@link File#lastModified()}. If
1475      * desired, you can exert more control over how files are deleted using
1476      * {@link StorageManager#setCacheBehaviorGroup(File, boolean)} and
1477      * {@link StorageManager#setCacheBehaviorTombstone(File, boolean)}.
1478      * <p>
1479      * Apps are strongly encouraged to keep their usage of cache space below the
1480      * quota returned by
1481      * {@link StorageManager#getCacheQuotaBytes(java.util.UUID)}. If your app
1482      * goes above this quota, your cached files will be some of the first to be
1483      * deleted when additional disk space is needed. Conversely, if your app
1484      * stays under this quota, your cached files will be some of the last to be
1485      * deleted when additional disk space is needed.
1486      * <p>
1487      * Note that your cache quota will change over time depending on how
1488      * frequently the user interacts with your app, and depending on how much
1489      * system-wide disk space is used.
1490      * <p>
1491      * The returned path may change over time if the calling app is moved to an
1492      * adopted storage device, so only relative paths should be persisted.
1493      * <p>
1494      * Apps require no extra permissions to read or write to the returned path,
1495      * since this path lives in their private storage.
1496      *
1497      * @return The path of the directory holding application cache files.
1498      * @see #openFileOutput
1499      * @see #getFileStreamPath
1500      * @see #getDir
1501      * @see #getExternalCacheDir
1502      */
getCacheDir()1503     public abstract File getCacheDir();
1504 
1505     /**
1506      * Returns the absolute path to the application specific cache directory on
1507      * the filesystem designed for storing cached code.
1508      * <p>
1509      * The system will delete any files stored in this location both when your
1510      * specific application is upgraded, and when the entire platform is
1511      * upgraded.
1512      * <p>
1513      * This location is optimal for storing compiled or optimized code generated
1514      * by your application at runtime.
1515      * <p>
1516      * The returned path may change over time if the calling app is moved to an
1517      * adopted storage device, so only relative paths should be persisted.
1518      * <p>
1519      * Apps require no extra permissions to read or write to the returned path,
1520      * since this path lives in their private storage.
1521      *
1522      * @return The path of the directory holding application code cache files.
1523      */
getCodeCacheDir()1524     public abstract File getCodeCacheDir();
1525 
1526     /**
1527      * Returns absolute path to application-specific directory on the primary
1528      * shared/external storage device where the application can place cache
1529      * files it owns. These files are internal to the application, and not
1530      * typically visible to the user as media.
1531      * <p>
1532      * This is like {@link #getCacheDir()} in that these files will be deleted
1533      * when the application is uninstalled, however there are some important
1534      * differences:
1535      * <ul>
1536      * <li>The platform does not always monitor the space available in shared
1537      * storage, and thus may not automatically delete these files. Apps should
1538      * always manage the maximum space used in this location. Currently the only
1539      * time files here will be deleted by the platform is when running on
1540      * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} or later and
1541      * {@link Environment#isExternalStorageEmulated(File)} returns true.
1542      * <li>Shared storage may not always be available, since removable media can
1543      * be ejected by the user. Media state can be checked using
1544      * {@link Environment#getExternalStorageState(File)}.
1545      * <li>There is no security enforced with these files. For example, any
1546      * application holding
1547      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
1548      * these files.
1549      * </ul>
1550      * <p>
1551      * If a shared storage device is emulated (as determined by
1552      * {@link Environment#isExternalStorageEmulated(File)}), its contents are
1553      * backed by a private user data partition, which means there is little
1554      * benefit to storing data here instead of the private directory returned by
1555      * {@link #getCacheDir()}.
1556      * <p>
1557      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
1558      * are required to read or write to the returned path; it's always
1559      * accessible to the calling app. This only applies to paths generated for
1560      * package name of the calling application. To access paths belonging to
1561      * other packages,
1562      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
1563      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
1564      * <p>
1565      * On devices with multiple users (as described by {@link UserManager}),
1566      * each user has their own isolated shared storage. Applications only have
1567      * access to the shared storage for the user they're running as.
1568      * <p>
1569      * The returned path may change over time if different shared storage media
1570      * is inserted, so only relative paths should be persisted.
1571      *
1572      * @return the absolute path to application-specific directory. May return
1573      *         {@code null} if shared storage is not currently available.
1574      * @see #getCacheDir
1575      * @see #getExternalCacheDirs()
1576      * @see Environment#getExternalStorageState(File)
1577      * @see Environment#isExternalStorageEmulated(File)
1578      * @see Environment#isExternalStorageRemovable(File)
1579      */
1580     @Nullable
getExternalCacheDir()1581     public abstract File getExternalCacheDir();
1582 
1583     /**
1584      * Returns absolute path to application-specific directory in the preloaded cache.
1585      * <p>Files stored in the cache directory can be deleted when the device runs low on storage.
1586      * There is no guarantee when these files will be deleted.
1587      * @hide
1588      */
1589     @SuppressWarnings("HiddenAbstractMethod")
1590     @Nullable
1591     @SystemApi
getPreloadsFileCache()1592     public abstract File getPreloadsFileCache();
1593 
1594     /**
1595      * Returns absolute paths to application-specific directories on all
1596      * shared/external storage devices where the application can place cache
1597      * files it owns. These files are internal to the application, and not
1598      * typically visible to the user as media.
1599      * <p>
1600      * This is like {@link #getCacheDir()} in that these files will be deleted
1601      * when the application is uninstalled, however there are some important
1602      * differences:
1603      * <ul>
1604      * <li>The platform does not always monitor the space available in shared
1605      * storage, and thus may not automatically delete these files. Apps should
1606      * always manage the maximum space used in this location. Currently the only
1607      * time files here will be deleted by the platform is when running on
1608      * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} or later and
1609      * {@link Environment#isExternalStorageEmulated(File)} returns true.
1610      * <li>Shared storage may not always be available, since removable media can
1611      * be ejected by the user. Media state can be checked using
1612      * {@link Environment#getExternalStorageState(File)}.
1613      * <li>There is no security enforced with these files. For example, any
1614      * application holding
1615      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
1616      * these files.
1617      * </ul>
1618      * <p>
1619      * If a shared storage device is emulated (as determined by
1620      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
1621      * backed by a private user data partition, which means there is little
1622      * benefit to storing data here instead of the private directory returned by
1623      * {@link #getCacheDir()}.
1624      * <p>
1625      * Shared storage devices returned here are considered a stable part of the
1626      * device, including physical media slots under a protective cover. The
1627      * returned paths do not include transient devices, such as USB flash drives
1628      * connected to handheld devices.
1629      * <p>
1630      * An application may store data on any or all of the returned devices. For
1631      * example, an app may choose to store large files on the device with the
1632      * most available space, as measured by {@link StatFs}.
1633      * <p>
1634      * No additional permissions are required for the calling app to read or
1635      * write files under the returned path. Write access outside of these paths
1636      * on secondary external storage devices is not available.
1637      * <p>
1638      * The returned paths may change over time if different shared storage media
1639      * is inserted, so only relative paths should be persisted.
1640      *
1641      * @return the absolute paths to application-specific directories. Some
1642      *         individual paths may be {@code null} if that shared storage is
1643      *         not currently available. The first path returned is the same as
1644      *         {@link #getExternalCacheDir()}.
1645      * @see #getExternalCacheDir()
1646      * @see Environment#getExternalStorageState(File)
1647      * @see Environment#isExternalStorageEmulated(File)
1648      * @see Environment#isExternalStorageRemovable(File)
1649      */
getExternalCacheDirs()1650     public abstract File[] getExternalCacheDirs();
1651 
1652     /**
1653      * Returns absolute paths to application-specific directories on all
1654      * shared/external storage devices where the application can place media
1655      * files. These files are scanned and made available to other apps through
1656      * {@link MediaStore}.
1657      * <p>
1658      * This is like {@link #getExternalFilesDirs} in that these files will be
1659      * deleted when the application is uninstalled, however there are some
1660      * important differences:
1661      * <ul>
1662      * <li>Shared storage may not always be available, since removable media can
1663      * be ejected by the user. Media state can be checked using
1664      * {@link Environment#getExternalStorageState(File)}.
1665      * <li>There is no security enforced with these files. For example, any
1666      * application holding
1667      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
1668      * these files.
1669      * </ul>
1670      * <p>
1671      * Shared storage devices returned here are considered a stable part of the
1672      * device, including physical media slots under a protective cover. The
1673      * returned paths do not include transient devices, such as USB flash drives
1674      * connected to handheld devices.
1675      * <p>
1676      * An application may store data on any or all of the returned devices. For
1677      * example, an app may choose to store large files on the device with the
1678      * most available space, as measured by {@link StatFs}.
1679      * <p>
1680      * No additional permissions are required for the calling app to read or
1681      * write files under the returned path. Write access outside of these paths
1682      * on secondary external storage devices is not available.
1683      * <p>
1684      * The returned paths may change over time if different shared storage media
1685      * is inserted, so only relative paths should be persisted.
1686      *
1687      * @return the absolute paths to application-specific directories. Some
1688      *         individual paths may be {@code null} if that shared storage is
1689      *         not currently available.
1690      * @see Environment#getExternalStorageState(File)
1691      * @see Environment#isExternalStorageEmulated(File)
1692      * @see Environment#isExternalStorageRemovable(File)
1693      * @deprecated These directories still exist and are scanned, but developers
1694      *             are encouraged to migrate to inserting content into a
1695      *             {@link MediaStore} collection directly, as any app can
1696      *             contribute new media to {@link MediaStore} with no
1697      *             permissions required, starting in
1698      *             {@link android.os.Build.VERSION_CODES#Q}.
1699      */
1700     @Deprecated
getExternalMediaDirs()1701     public abstract File[] getExternalMediaDirs();
1702 
1703     /**
1704      * Returns an array of strings naming the private files associated with
1705      * this Context's application package.
1706      *
1707      * @return Array of strings naming the private files.
1708      *
1709      * @see #openFileInput
1710      * @see #openFileOutput
1711      * @see #deleteFile
1712      */
fileList()1713     public abstract String[] fileList();
1714 
1715     /**
1716      * Retrieve, creating if needed, a new directory in which the application
1717      * can place its own custom data files.  You can use the returned File
1718      * object to create and access files in this directory.  Note that files
1719      * created through a File object will only be accessible by your own
1720      * application; you can only set the mode of the entire directory, not
1721      * of individual files.
1722      * <p>
1723      * The returned path may change over time if the calling app is moved to an
1724      * adopted storage device, so only relative paths should be persisted.
1725      * <p>
1726      * Apps require no extra permissions to read or write to the returned path,
1727      * since this path lives in their private storage.
1728      *
1729      * @param name Name of the directory to retrieve.  This is a directory
1730      * that is created as part of your application data.
1731      * @param mode Operating mode.
1732      *
1733      * @return A {@link File} object for the requested directory.  The directory
1734      * will have been created if it does not already exist.
1735      *
1736      * @see #openFileOutput(String, int)
1737      */
getDir(String name, @FileMode int mode)1738     public abstract File getDir(String name, @FileMode int mode);
1739 
1740     /**
1741      * Open a new private SQLiteDatabase associated with this Context's
1742      * application package. Create the database file if it doesn't exist.
1743      *
1744      * @param name The name (unique in the application package) of the database.
1745      * @param mode Operating mode.
1746      * @param factory An optional factory class that is called to instantiate a
1747      *            cursor when query is called.
1748      * @return The contents of a newly created database with the given name.
1749      * @throws android.database.sqlite.SQLiteException if the database file
1750      *             could not be opened.
1751      * @see #MODE_PRIVATE
1752      * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING
1753      * @see #MODE_NO_LOCALIZED_COLLATORS
1754      * @see #deleteDatabase
1755      */
openOrCreateDatabase(String name, @DatabaseMode int mode, CursorFactory factory)1756     public abstract SQLiteDatabase openOrCreateDatabase(String name,
1757             @DatabaseMode int mode, CursorFactory factory);
1758 
1759     /**
1760      * Open a new private SQLiteDatabase associated with this Context's
1761      * application package. Creates the database file if it doesn't exist.
1762      * <p>
1763      * Accepts input param: a concrete instance of {@link DatabaseErrorHandler}
1764      * to be used to handle corruption when sqlite reports database corruption.
1765      * </p>
1766      *
1767      * @param name The name (unique in the application package) of the database.
1768      * @param mode Operating mode.
1769      * @param factory An optional factory class that is called to instantiate a
1770      *            cursor when query is called.
1771      * @param errorHandler the {@link DatabaseErrorHandler} to be used when
1772      *            sqlite reports database corruption. if null,
1773      *            {@link android.database.DefaultDatabaseErrorHandler} is
1774      *            assumed.
1775      * @return The contents of a newly created database with the given name.
1776      * @throws android.database.sqlite.SQLiteException if the database file
1777      *             could not be opened.
1778      * @see #MODE_PRIVATE
1779      * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING
1780      * @see #MODE_NO_LOCALIZED_COLLATORS
1781      * @see #deleteDatabase
1782      */
openOrCreateDatabase(String name, @DatabaseMode int mode, CursorFactory factory, @Nullable DatabaseErrorHandler errorHandler)1783     public abstract SQLiteDatabase openOrCreateDatabase(String name,
1784             @DatabaseMode int mode, CursorFactory factory,
1785             @Nullable DatabaseErrorHandler errorHandler);
1786 
1787     /**
1788      * Move an existing database file from the given source storage context to
1789      * this context. This is typically used to migrate data between storage
1790      * locations after an upgrade, such as migrating to device protected
1791      * storage.
1792      * <p>
1793      * The database must be closed before being moved.
1794      *
1795      * @param sourceContext The source context which contains the existing
1796      *            database to move.
1797      * @param name The name of the database file.
1798      * @return {@code true} if the move was successful or if the database didn't
1799      *         exist in the source context, otherwise {@code false}.
1800      * @see #createDeviceProtectedStorageContext()
1801      */
moveDatabaseFrom(Context sourceContext, String name)1802     public abstract boolean moveDatabaseFrom(Context sourceContext, String name);
1803 
1804     /**
1805      * Delete an existing private SQLiteDatabase associated with this Context's
1806      * application package.
1807      *
1808      * @param name The name (unique in the application package) of the
1809      *             database.
1810      *
1811      * @return {@code true} if the database was successfully deleted; else {@code false}.
1812      *
1813      * @see #openOrCreateDatabase
1814      */
deleteDatabase(String name)1815     public abstract boolean deleteDatabase(String name);
1816 
1817     /**
1818      * Returns the absolute path on the filesystem where a database created with
1819      * {@link #openOrCreateDatabase} is stored.
1820      * <p>
1821      * The returned path may change over time if the calling app is moved to an
1822      * adopted storage device, so only relative paths should be persisted.
1823      *
1824      * @param name The name of the database for which you would like to get
1825      *          its path.
1826      *
1827      * @return An absolute path to the given database.
1828      *
1829      * @see #openOrCreateDatabase
1830      */
getDatabasePath(String name)1831     public abstract File getDatabasePath(String name);
1832 
1833     /**
1834      * Returns an array of strings naming the private databases associated with
1835      * this Context's application package.
1836      *
1837      * @return Array of strings naming the private databases.
1838      *
1839      * @see #openOrCreateDatabase
1840      * @see #deleteDatabase
1841      */
databaseList()1842     public abstract String[] databaseList();
1843 
1844     /**
1845      * @deprecated Use {@link android.app.WallpaperManager#getDrawable
1846      * WallpaperManager.get()} instead.
1847      */
1848     @Deprecated
getWallpaper()1849     public abstract Drawable getWallpaper();
1850 
1851     /**
1852      * @deprecated Use {@link android.app.WallpaperManager#peekDrawable
1853      * WallpaperManager.peek()} instead.
1854      */
1855     @Deprecated
peekWallpaper()1856     public abstract Drawable peekWallpaper();
1857 
1858     /**
1859      * @deprecated Use {@link android.app.WallpaperManager#getDesiredMinimumWidth()
1860      * WallpaperManager.getDesiredMinimumWidth()} instead.
1861      */
1862     @Deprecated
getWallpaperDesiredMinimumWidth()1863     public abstract int getWallpaperDesiredMinimumWidth();
1864 
1865     /**
1866      * @deprecated Use {@link android.app.WallpaperManager#getDesiredMinimumHeight()
1867      * WallpaperManager.getDesiredMinimumHeight()} instead.
1868      */
1869     @Deprecated
getWallpaperDesiredMinimumHeight()1870     public abstract int getWallpaperDesiredMinimumHeight();
1871 
1872     /**
1873      * @deprecated Use {@link android.app.WallpaperManager#setBitmap(Bitmap)
1874      * WallpaperManager.set()} instead.
1875      * <p>This method requires the caller to hold the permission
1876      * {@link android.Manifest.permission#SET_WALLPAPER}.
1877      */
1878     @Deprecated
setWallpaper(Bitmap bitmap)1879     public abstract void setWallpaper(Bitmap bitmap) throws IOException;
1880 
1881     /**
1882      * @deprecated Use {@link android.app.WallpaperManager#setStream(InputStream)
1883      * WallpaperManager.set()} instead.
1884      * <p>This method requires the caller to hold the permission
1885      * {@link android.Manifest.permission#SET_WALLPAPER}.
1886      */
1887     @Deprecated
setWallpaper(InputStream data)1888     public abstract void setWallpaper(InputStream data) throws IOException;
1889 
1890     /**
1891      * @deprecated Use {@link android.app.WallpaperManager#clear
1892      * WallpaperManager.clear()} instead.
1893      * <p>This method requires the caller to hold the permission
1894      * {@link android.Manifest.permission#SET_WALLPAPER}.
1895      */
1896     @Deprecated
clearWallpaper()1897     public abstract void clearWallpaper() throws IOException;
1898 
1899     /**
1900      * Same as {@link #startActivity(Intent, Bundle)} with no options
1901      * specified.
1902      *
1903      * @param intent The description of the activity to start.
1904      *
1905      * @throws ActivityNotFoundException &nbsp;
1906      *`
1907      * @see #startActivity(Intent, Bundle)
1908      * @see PackageManager#resolveActivity
1909      */
startActivity(@equiresPermission Intent intent)1910     public abstract void startActivity(@RequiresPermission Intent intent);
1911 
1912     /**
1913      * Version of {@link #startActivity(Intent)} that allows you to specify the
1914      * user the activity will be started for.  This is not available to applications
1915      * that are not pre-installed on the system image.
1916      * @param intent The description of the activity to start.
1917      * @param user The UserHandle of the user to start this activity for.
1918      * @throws ActivityNotFoundException &nbsp;
1919      * @hide
1920      */
1921     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
1922     @SystemApi
startActivityAsUser(@equiresPermission @onNull Intent intent, @NonNull UserHandle user)1923     public void startActivityAsUser(@RequiresPermission @NonNull Intent intent,
1924             @NonNull UserHandle user) {
1925         throw new RuntimeException("Not implemented. Must override in a subclass.");
1926     }
1927 
1928     /**
1929      * Launch a new activity.  You will not receive any information about when
1930      * the activity exits.
1931      *
1932      * <p>Note that if this method is being called from outside of an
1933      * {@link android.app.Activity} Context, then the Intent must include
1934      * the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag.  This is because,
1935      * without being started from an existing Activity, there is no existing
1936      * task in which to place the new activity and thus it needs to be placed
1937      * in its own separate task.
1938      *
1939      * <p>This method throws {@link ActivityNotFoundException}
1940      * if there was no Activity found to run the given Intent.
1941      *
1942      * @param intent The description of the activity to start.
1943      * @param options Additional options for how the Activity should be started.
1944      * May be null if there are no options.  See {@link android.app.ActivityOptions}
1945      * for how to build the Bundle supplied here; there are no supported definitions
1946      * for building it manually.
1947      *
1948      * @throws ActivityNotFoundException &nbsp;
1949      *
1950      * @see #startActivity(Intent)
1951      * @see PackageManager#resolveActivity
1952      */
startActivity(@equiresPermission Intent intent, @Nullable Bundle options)1953     public abstract void startActivity(@RequiresPermission Intent intent,
1954             @Nullable Bundle options);
1955 
1956     /**
1957      * Version of {@link #startActivity(Intent, Bundle)} that allows you to specify the
1958      * user the activity will be started for.  This is not available to applications
1959      * that are not pre-installed on the system image.
1960      * @param intent The description of the activity to start.
1961      * @param options Additional options for how the Activity should be started.
1962      * May be null if there are no options.  See {@link android.app.ActivityOptions}
1963      * for how to build the Bundle supplied here; there are no supported definitions
1964      * for building it manually.
1965      * @param userId The UserHandle of the user to start this activity for.
1966      * @throws ActivityNotFoundException &nbsp;
1967      * @hide
1968      */
1969     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
1970     @UnsupportedAppUsage
startActivityAsUser(@equiresPermission Intent intent, @Nullable Bundle options, UserHandle userId)1971     public void startActivityAsUser(@RequiresPermission Intent intent, @Nullable Bundle options,
1972             UserHandle userId) {
1973         throw new RuntimeException("Not implemented. Must override in a subclass.");
1974     }
1975 
1976     /**
1977      * Version of {@link #startActivity(Intent, Bundle)} that returns a result to the caller. This
1978      * is only supported for Views and Fragments.
1979      * @param who The identifier for the calling element that will receive the result.
1980      * @param intent The intent to start.
1981      * @param requestCode The code that will be returned with onActivityResult() identifying this
1982      *          request.
1983      * @param options Additional options for how the Activity should be started.
1984      *          May be null if there are no options.  See {@link android.app.ActivityOptions}
1985      *          for how to build the Bundle supplied here; there are no supported definitions
1986      *          for building it manually.
1987      * @hide
1988      */
1989     @UnsupportedAppUsage
startActivityForResult( @onNull String who, Intent intent, int requestCode, @Nullable Bundle options)1990     public void startActivityForResult(
1991             @NonNull String who, Intent intent, int requestCode, @Nullable Bundle options) {
1992         throw new RuntimeException("This method is only implemented for Activity-based Contexts. "
1993                 + "Check canStartActivityForResult() before calling.");
1994     }
1995 
1996     /**
1997      * Identifies whether this Context instance will be able to process calls to
1998      * {@link #startActivityForResult(String, Intent, int, Bundle)}.
1999      * @hide
2000      */
2001     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
canStartActivityForResult()2002     public boolean canStartActivityForResult() {
2003         return false;
2004     }
2005 
2006     /**
2007      * Same as {@link #startActivities(Intent[], Bundle)} with no options
2008      * specified.
2009      *
2010      * @param intents An array of Intents to be started.
2011      *
2012      * @throws ActivityNotFoundException &nbsp;
2013      *
2014      * @see #startActivities(Intent[], Bundle)
2015      * @see PackageManager#resolveActivity
2016      */
startActivities(@equiresPermission Intent[] intents)2017     public abstract void startActivities(@RequiresPermission Intent[] intents);
2018 
2019     /**
2020      * Launch multiple new activities.  This is generally the same as calling
2021      * {@link #startActivity(Intent)} for the first Intent in the array,
2022      * that activity during its creation calling {@link #startActivity(Intent)}
2023      * for the second entry, etc.  Note that unlike that approach, generally
2024      * none of the activities except the last in the array will be created
2025      * at this point, but rather will be created when the user first visits
2026      * them (due to pressing back from the activity on top).
2027      *
2028      * <p>This method throws {@link ActivityNotFoundException}
2029      * if there was no Activity found for <em>any</em> given Intent.  In this
2030      * case the state of the activity stack is undefined (some Intents in the
2031      * list may be on it, some not), so you probably want to avoid such situations.
2032      *
2033      * @param intents An array of Intents to be started.
2034      * @param options Additional options for how the Activity should be started.
2035      * See {@link android.content.Context#startActivity(Intent, Bundle)}
2036      * Context.startActivity(Intent, Bundle)} for more details.
2037      *
2038      * @throws ActivityNotFoundException &nbsp;
2039      *
2040      * @see #startActivities(Intent[])
2041      * @see PackageManager#resolveActivity
2042      */
startActivities(@equiresPermission Intent[] intents, Bundle options)2043     public abstract void startActivities(@RequiresPermission Intent[] intents, Bundle options);
2044 
2045     /**
2046      * @hide
2047      * Launch multiple new activities.  This is generally the same as calling
2048      * {@link #startActivity(Intent)} for the first Intent in the array,
2049      * that activity during its creation calling {@link #startActivity(Intent)}
2050      * for the second entry, etc.  Note that unlike that approach, generally
2051      * none of the activities except the last in the array will be created
2052      * at this point, but rather will be created when the user first visits
2053      * them (due to pressing back from the activity on top).
2054      *
2055      * <p>This method throws {@link ActivityNotFoundException}
2056      * if there was no Activity found for <em>any</em> given Intent.  In this
2057      * case the state of the activity stack is undefined (some Intents in the
2058      * list may be on it, some not), so you probably want to avoid such situations.
2059      *
2060      * @param intents An array of Intents to be started.
2061      * @param options Additional options for how the Activity should be started.
2062      * @param userHandle The user for whom to launch the activities
2063      * See {@link android.content.Context#startActivity(Intent, Bundle)}
2064      * Context.startActivity(Intent, Bundle)} for more details.
2065      *
2066      * @return The corresponding flag {@link ActivityManager#START_CANCELED},
2067      *         {@link ActivityManager#START_SUCCESS} etc. indicating whether the launch was
2068      *         successful.
2069      *
2070      * @throws ActivityNotFoundException &nbsp;
2071      *
2072      * @see #startActivities(Intent[])
2073      * @see PackageManager#resolveActivity
2074      */
2075     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle)2076     public int startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
2077         throw new RuntimeException("Not implemented. Must override in a subclass.");
2078     }
2079 
2080     /**
2081      * Same as {@link #startIntentSender(IntentSender, Intent, int, int, int, Bundle)}
2082      * with no options specified.
2083      *
2084      * @param intent The IntentSender to launch.
2085      * @param fillInIntent If non-null, this will be provided as the
2086      * intent parameter to {@link IntentSender#sendIntent}.
2087      * @param flagsMask Intent flags in the original IntentSender that you
2088      * would like to change.
2089      * @param flagsValues Desired values for any bits set in
2090      * <var>flagsMask</var>
2091      * @param extraFlags Always set to 0.
2092      *
2093      * @see #startActivity(Intent)
2094      * @see #startIntentSender(IntentSender, Intent, int, int, int, Bundle)
2095      */
startIntentSender(IntentSender intent, @Nullable Intent fillInIntent, @Intent.MutableFlags int flagsMask, @Intent.MutableFlags int flagsValues, int extraFlags)2096     public abstract void startIntentSender(IntentSender intent, @Nullable Intent fillInIntent,
2097             @Intent.MutableFlags int flagsMask, @Intent.MutableFlags int flagsValues,
2098             int extraFlags) throws IntentSender.SendIntentException;
2099 
2100     /**
2101      * Like {@link #startActivity(Intent, Bundle)}, but taking a IntentSender
2102      * to start.  If the IntentSender is for an activity, that activity will be started
2103      * as if you had called the regular {@link #startActivity(Intent)}
2104      * here; otherwise, its associated action will be executed (such as
2105      * sending a broadcast) as if you had called
2106      * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
2107      *
2108      * @param intent The IntentSender to launch.
2109      * @param fillInIntent If non-null, this will be provided as the
2110      * intent parameter to {@link IntentSender#sendIntent}.
2111      * @param flagsMask Intent flags in the original IntentSender that you
2112      * would like to change.
2113      * @param flagsValues Desired values for any bits set in
2114      * <var>flagsMask</var>
2115      * @param extraFlags Always set to 0.
2116      * @param options Additional options for how the Activity should be started.
2117      * See {@link android.content.Context#startActivity(Intent, Bundle)}
2118      * Context.startActivity(Intent, Bundle)} for more details.  If options
2119      * have also been supplied by the IntentSender, options given here will
2120      * override any that conflict with those given by the IntentSender.
2121      *
2122      * @see #startActivity(Intent, Bundle)
2123      * @see #startIntentSender(IntentSender, Intent, int, int, int)
2124      */
startIntentSender(IntentSender intent, @Nullable Intent fillInIntent, @Intent.MutableFlags int flagsMask, @Intent.MutableFlags int flagsValues, int extraFlags, @Nullable Bundle options)2125     public abstract void startIntentSender(IntentSender intent, @Nullable Intent fillInIntent,
2126             @Intent.MutableFlags int flagsMask, @Intent.MutableFlags int flagsValues,
2127             int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException;
2128 
2129     /**
2130      * Broadcast the given intent to all interested BroadcastReceivers.  This
2131      * call is asynchronous; it returns immediately, and you will continue
2132      * executing while the receivers are run.  No results are propagated from
2133      * receivers and receivers can not abort the broadcast. If you want
2134      * to allow receivers to propagate results or abort the broadcast, you must
2135      * send an ordered broadcast using
2136      * {@link #sendOrderedBroadcast(Intent, String)}.
2137      *
2138      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2139      *
2140      * @param intent The Intent to broadcast; all receivers matching this
2141      *               Intent will receive the broadcast.
2142      *
2143      * @see android.content.BroadcastReceiver
2144      * @see #registerReceiver
2145      * @see #sendBroadcast(Intent, String)
2146      * @see #sendOrderedBroadcast(Intent, String)
2147      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2148      */
sendBroadcast(@equiresPermission Intent intent)2149     public abstract void sendBroadcast(@RequiresPermission Intent intent);
2150 
2151     /**
2152      * Broadcast the given intent to all interested BroadcastReceivers, allowing
2153      * an optional required permission to be enforced.  This
2154      * call is asynchronous; it returns immediately, and you will continue
2155      * executing while the receivers are run.  No results are propagated from
2156      * receivers and receivers can not abort the broadcast. If you want
2157      * to allow receivers to propagate results or abort the broadcast, you must
2158      * send an ordered broadcast using
2159      * {@link #sendOrderedBroadcast(Intent, String)}.
2160      *
2161      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2162      *
2163      * @param intent The Intent to broadcast; all receivers matching this
2164      *               Intent will receive the broadcast.
2165      * @param receiverPermission (optional) String naming a permission that
2166      *               a receiver must hold in order to receive your broadcast.
2167      *               If null, no permission is required.
2168      *
2169      * @see android.content.BroadcastReceiver
2170      * @see #registerReceiver
2171      * @see #sendBroadcast(Intent)
2172      * @see #sendOrderedBroadcast(Intent, String)
2173      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2174      */
sendBroadcast(@equiresPermission Intent intent, @Nullable String receiverPermission)2175     public abstract void sendBroadcast(@RequiresPermission Intent intent,
2176             @Nullable String receiverPermission);
2177 
2178 
2179     /**
2180      * Broadcast the given intent to all interested BroadcastReceivers, allowing
2181      * an array of required permissions to be enforced.  This call is asynchronous; it returns
2182      * immediately, and you will continue executing while the receivers are run.  No results are
2183      * propagated from receivers and receivers can not abort the broadcast. If you want to allow
2184      * receivers to propagate results or abort the broadcast, you must send an ordered broadcast
2185      * using {@link #sendOrderedBroadcast(Intent, String)}.
2186      *
2187      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2188      *
2189      * @param intent The Intent to broadcast; all receivers matching this
2190      *               Intent will receive the broadcast.
2191      * @param receiverPermissions Array of names of permissions that a receiver must hold
2192      *                            in order to receive your broadcast.
2193      *                            If empty, no permissions are required.
2194      *
2195      * @see android.content.BroadcastReceiver
2196      * @see #registerReceiver
2197      * @see #sendBroadcast(Intent)
2198      * @see #sendOrderedBroadcast(Intent, String)
2199      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2200      * @hide
2201      */
sendBroadcastMultiplePermissions(@onNull Intent intent, @NonNull String[] receiverPermissions)2202     public void sendBroadcastMultiplePermissions(@NonNull Intent intent,
2203             @NonNull String[] receiverPermissions) {
2204         throw new RuntimeException("Not implemented. Must override in a subclass.");
2205     }
2206 
2207     /**
2208      * Like {@link #sendBroadcastMultiplePermissions(Intent, String[])}, but also allows
2209      * specification of a list of excluded permissions. This allows sending a broadcast to an
2210      * app that has the permissions in `receiverPermissions` but not `excludedPermissions`.
2211      * @hide
2212      */
sendBroadcastMultiplePermissions(@onNull Intent intent, @NonNull String[] receiverPermissions, @Nullable String[] excludedPermissions)2213     public void sendBroadcastMultiplePermissions(@NonNull Intent intent,
2214             @NonNull String[] receiverPermissions, @Nullable String[] excludedPermissions) {
2215         throw new RuntimeException("Not implemented. Must override in a subclass.");
2216     }
2217 
2218     /**
2219      * Version of {@link #sendBroadcastMultiplePermissions(Intent, String[])} that allows you to
2220      * specify the {@link android.app.BroadcastOptions}.
2221      *
2222      * @param intent The Intent to broadcast; all receivers matching this
2223      *               Intent will receive the broadcast.
2224      * @param receiverPermissions Array of names of permissions that a receiver must hold
2225      *                            in order to receive your broadcast.
2226      *                            If empty, no permissions are required.
2227      * @param options Additional sending options, generated from a
2228      *                {@link android.app.BroadcastOptions}.
2229      * @see #sendBroadcastMultiplePermissions(Intent, String[])
2230      * @see android.app.BroadcastOptions
2231      * @hide
2232      */
sendBroadcastMultiplePermissions(@onNull Intent intent, @NonNull String[] receiverPermissions, @Nullable Bundle options)2233     public void sendBroadcastMultiplePermissions(@NonNull Intent intent,
2234             @NonNull String[] receiverPermissions, @Nullable Bundle options) {
2235         throw new RuntimeException("Not implemented. Must override in a subclass.");
2236     }
2237 
2238     /**
2239      * Broadcast the given intent to all interested BroadcastReceivers, allowing
2240      * an array of required permissions to be enforced.  This call is asynchronous; it returns
2241      * immediately, and you will continue executing while the receivers are run.  No results are
2242      * propagated from receivers and receivers can not abort the broadcast. If you want to allow
2243      * receivers to propagate results or abort the broadcast, you must send an ordered broadcast
2244      * using {@link #sendOrderedBroadcast(Intent, String)}.
2245      *
2246      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2247      *
2248      * @param intent The Intent to broadcast; all receivers matching this
2249      *               Intent will receive the broadcast.
2250      * @param receiverPermissions Array of names of permissions that a receiver must hold
2251      *                            in order to receive your broadcast.
2252      *                            If empty, no permissions are required.
2253      *
2254      * @see android.content.BroadcastReceiver
2255      * @see #registerReceiver
2256      * @see #sendBroadcast(Intent)
2257      * @see #sendOrderedBroadcast(Intent, String)
2258      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2259      */
sendBroadcastWithMultiplePermissions(@onNull Intent intent, @NonNull String[] receiverPermissions)2260     public void sendBroadcastWithMultiplePermissions(@NonNull Intent intent,
2261             @NonNull String[] receiverPermissions) {
2262         sendBroadcastMultiplePermissions(intent, receiverPermissions);
2263     }
2264 
2265     /**
2266      * Broadcast the given intent to all interested BroadcastReceivers, allowing
2267      * an array of required permissions to be enforced.  This call is asynchronous; it returns
2268      * immediately, and you will continue executing while the receivers are run.  No results are
2269      * propagated from receivers and receivers can not abort the broadcast. If you want to allow
2270      * receivers to propagate results or abort the broadcast, you must send an ordered broadcast
2271      * using {@link #sendOrderedBroadcast(Intent, String)}.
2272      *
2273      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2274      *
2275      * @param intent The Intent to broadcast; all receivers matching this
2276      *               Intent will receive the broadcast.
2277      * @param user The user to send the broadcast to.
2278      * @param receiverPermissions Array of names of permissions that a receiver must hold
2279      *                            in order to receive your broadcast.
2280      *                            If null or empty, no permissions are required.
2281      *
2282      * @see android.content.BroadcastReceiver
2283      * @see #registerReceiver
2284      * @see #sendBroadcast(Intent)
2285      * @see #sendOrderedBroadcast(Intent, String)
2286      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2287      * @hide
2288      */
2289     @SuppressWarnings("HiddenAbstractMethod")
sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, String[] receiverPermissions)2290     public abstract void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
2291             String[] receiverPermissions);
2292 
2293     /**
2294      * Broadcast the given intent to all interested BroadcastReceivers, allowing
2295      * an optional required permission to be enforced.  This
2296      * call is asynchronous; it returns immediately, and you will continue
2297      * executing while the receivers are run.  No results are propagated from
2298      * receivers and receivers can not abort the broadcast. If you want
2299      * to allow receivers to propagate results or abort the broadcast, you must
2300      * send an ordered broadcast using
2301      * {@link #sendOrderedBroadcast(Intent, String)}.
2302      *
2303      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2304      *
2305      * @param intent The Intent to broadcast; all receivers matching this
2306      *               Intent will receive the broadcast.
2307      * @param receiverPermission (optional) String naming a permission that
2308      *               a receiver must hold in order to receive your broadcast.
2309      *               If null, no permission is required.
2310      * @param options (optional) Additional sending options, generated from a
2311      * {@link android.app.BroadcastOptions}.
2312      *
2313      * @see android.content.BroadcastReceiver
2314      * @see #registerReceiver
2315      * @see #sendBroadcast(Intent)
2316      * @see #sendOrderedBroadcast(Intent, String)
2317      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2318      * @hide
2319      */
2320     @SuppressWarnings("HiddenAbstractMethod")
2321     @SystemApi
sendBroadcast(Intent intent, @Nullable String receiverPermission, @Nullable Bundle options)2322     public abstract void sendBroadcast(Intent intent,
2323             @Nullable String receiverPermission,
2324             @Nullable Bundle options);
2325 
2326     /**
2327      * Like {@link #sendBroadcast(Intent, String)}, but also allows specification
2328      * of an associated app op as per {@link android.app.AppOpsManager}.
2329      * @hide
2330      */
2331     @SuppressWarnings("HiddenAbstractMethod")
2332     @UnsupportedAppUsage
sendBroadcast(Intent intent, String receiverPermission, int appOp)2333     public abstract void sendBroadcast(Intent intent,
2334             String receiverPermission, int appOp);
2335 
2336     /**
2337      * Broadcast the given intent to all interested BroadcastReceivers, delivering
2338      * them one at a time to allow more preferred receivers to consume the
2339      * broadcast before it is delivered to less preferred receivers.  This
2340      * call is asynchronous; it returns immediately, and you will continue
2341      * executing while the receivers are run.
2342      *
2343      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2344      *
2345      * @param intent The Intent to broadcast; all receivers matching this
2346      *               Intent will receive the broadcast.
2347      * @param receiverPermission (optional) String naming a permissions that
2348      *               a receiver must hold in order to receive your broadcast.
2349      *               If null, no permission is required.
2350      *
2351      * @see android.content.BroadcastReceiver
2352      * @see #registerReceiver
2353      * @see #sendBroadcast(Intent)
2354      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2355      */
sendOrderedBroadcast(@equiresPermission Intent intent, @Nullable String receiverPermission)2356     public abstract void sendOrderedBroadcast(@RequiresPermission Intent intent,
2357             @Nullable String receiverPermission);
2358 
2359     /**
2360      * Version of {@link #sendBroadcast(Intent)} that allows you to
2361      * receive data back from the broadcast.  This is accomplished by
2362      * supplying your own BroadcastReceiver when calling, which will be
2363      * treated as a final receiver at the end of the broadcast -- its
2364      * {@link BroadcastReceiver#onReceive} method will be called with
2365      * the result values collected from the other receivers.  The broadcast will
2366      * be serialized in the same way as calling
2367      * {@link #sendOrderedBroadcast(Intent, String)}.
2368      *
2369      * <p>Like {@link #sendBroadcast(Intent)}, this method is
2370      * asynchronous; it will return before
2371      * resultReceiver.onReceive() is called.
2372      *
2373      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2374      *
2375      * @param intent The Intent to broadcast; all receivers matching this
2376      *               Intent will receive the broadcast.
2377      * @param receiverPermission String naming a permissions that
2378      *               a receiver must hold in order to receive your broadcast.
2379      *               If null, no permission is required.
2380      * @param resultReceiver Your own BroadcastReceiver to treat as the final
2381      *                       receiver of the broadcast.
2382      * @param scheduler A custom Handler with which to schedule the
2383      *                  resultReceiver callback; if null it will be
2384      *                  scheduled in the Context's main thread.
2385      * @param initialCode An initial value for the result code.  Often
2386      *                    Activity.RESULT_OK.
2387      * @param initialData An initial value for the result data.  Often
2388      *                    null.
2389      * @param initialExtras An initial value for the result extras.  Often
2390      *                      null.
2391      *
2392      * @see #sendBroadcast(Intent)
2393      * @see #sendBroadcast(Intent, String)
2394      * @see #sendOrderedBroadcast(Intent, String)
2395      * @see android.content.BroadcastReceiver
2396      * @see #registerReceiver
2397      * @see android.app.Activity#RESULT_OK
2398      */
sendOrderedBroadcast(@equiresPermission @onNull Intent intent, @Nullable String receiverPermission, @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2399     public abstract void sendOrderedBroadcast(@RequiresPermission @NonNull Intent intent,
2400             @Nullable String receiverPermission, @Nullable BroadcastReceiver resultReceiver,
2401             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
2402             @Nullable Bundle initialExtras);
2403 
2404     /**
2405      * Version of {@link #sendBroadcast(Intent)} that allows you to
2406      * receive data back from the broadcast.  This is accomplished by
2407      * supplying your own BroadcastReceiver when calling, which will be
2408      * treated as a final receiver at the end of the broadcast -- its
2409      * {@link BroadcastReceiver#onReceive} method will be called with
2410      * the result values collected from the other receivers.  The broadcast will
2411      * be serialized in the same way as calling
2412      * {@link #sendOrderedBroadcast(Intent, String)}.
2413      *
2414      * <p>Like {@link #sendBroadcast(Intent)}, this method is
2415      * asynchronous; it will return before
2416      * resultReceiver.onReceive() is called.
2417      *
2418      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2419      *
2420      *
2421      * @param intent The Intent to broadcast; all receivers matching this
2422      *               Intent will receive the broadcast.
2423      * @param receiverPermission String naming a permissions that
2424      *               a receiver must hold in order to receive your broadcast.
2425      *               If null, no permission is required.
2426      * @param options (optional) Additional sending options, generated from a
2427      * {@link android.app.BroadcastOptions}.
2428      * @param resultReceiver Your own BroadcastReceiver to treat as the final
2429      *                       receiver of the broadcast.
2430      * @param scheduler A custom Handler with which to schedule the
2431      *                  resultReceiver callback; if null it will be
2432      *                  scheduled in the Context's main thread.
2433      * @param initialCode An initial value for the result code.  Often
2434      *                    Activity.RESULT_OK.
2435      * @param initialData An initial value for the result data.  Often
2436      *                    null.
2437      * @param initialExtras An initial value for the result extras.  Often
2438      *                      null.
2439      * @see #sendBroadcast(Intent)
2440      * @see #sendBroadcast(Intent, String)
2441      * @see #sendOrderedBroadcast(Intent, String)
2442      * @see android.content.BroadcastReceiver
2443      * @see #registerReceiver
2444      * @see android.app.Activity#RESULT_OK
2445      * @hide
2446      */
2447     @SuppressWarnings("HiddenAbstractMethod")
2448     @SystemApi
sendOrderedBroadcast(@onNull Intent intent, @Nullable String receiverPermission, @Nullable Bundle options, @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2449     public abstract void sendOrderedBroadcast(@NonNull Intent intent,
2450             @Nullable String receiverPermission, @Nullable Bundle options,
2451             @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler,
2452             int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras);
2453 
2454     /**
2455      * Like {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler,
2456      * int, String, android.os.Bundle)}, but also allows specification
2457      * of an associated app op as per {@link android.app.AppOpsManager}.
2458      * @hide
2459      */
2460     @SuppressWarnings("HiddenAbstractMethod")
2461     @UnsupportedAppUsage
sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)2462     public abstract void sendOrderedBroadcast(Intent intent,
2463             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
2464             Handler scheduler, int initialCode, String initialData,
2465             Bundle initialExtras);
2466 
2467     /**
2468      * Version of {@link #sendBroadcast(Intent)} that allows you to specify the
2469      * user the broadcast will be sent to.  This is not available to applications
2470      * that are not pre-installed on the system image.
2471      * @param intent The intent to broadcast
2472      * @param user UserHandle to send the intent to.
2473      * @see #sendBroadcast(Intent)
2474      */
2475     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
sendBroadcastAsUser(@equiresPermission Intent intent, UserHandle user)2476     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
2477             UserHandle user);
2478 
2479     /**
2480      * Version of {@link #sendBroadcast(Intent, String)} that allows you to specify the
2481      * user the broadcast will be sent to.  This is not available to applications
2482      * that are not pre-installed on the system image.
2483      *
2484      * @param intent The Intent to broadcast; all receivers matching this
2485      *               Intent will receive the broadcast.
2486      * @param user UserHandle to send the intent to.
2487      * @param receiverPermission (optional) String naming a permission that
2488      *               a receiver must hold in order to receive your broadcast.
2489      *               If null, no permission is required.
2490      *
2491      * @see #sendBroadcast(Intent, String)
2492      */
2493     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
sendBroadcastAsUser(@equiresPermission Intent intent, UserHandle user, @Nullable String receiverPermission)2494     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
2495             UserHandle user, @Nullable String receiverPermission);
2496 
2497     /**
2498      * Version of {@link #sendBroadcast(Intent, String, Bundle)} that allows you to specify the
2499      * user the broadcast will be sent to.  This is not available to applications
2500      * that are not pre-installed on the system image.
2501      *
2502      * @param intent The Intent to broadcast; all receivers matching this
2503      *               Intent will receive the broadcast.
2504      * @param user UserHandle to send the intent to.
2505      * @param receiverPermission (optional) String naming a permission that
2506      *               a receiver must hold in order to receive your broadcast.
2507      *               If null, no permission is required.
2508      * @param options (optional) Additional sending options, generated from a
2509      * {@link android.app.BroadcastOptions}.
2510      *
2511      * @see #sendBroadcast(Intent, String, Bundle)
2512      * @hide
2513      */
2514     @SuppressWarnings("HiddenAbstractMethod")
2515     @SystemApi
2516     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
sendBroadcastAsUser(@equiresPermission Intent intent, UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options)2517     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
2518             UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options);
2519 
2520     /**
2521      * Version of {@link #sendBroadcast(Intent, String)} that allows you to specify the
2522      * user the broadcast will be sent to.  This is not available to applications
2523      * that are not pre-installed on the system image.
2524      *
2525      * @param intent The Intent to broadcast; all receivers matching this
2526      *               Intent will receive the broadcast.
2527      * @param user UserHandle to send the intent to.
2528      * @param receiverPermission (optional) String naming a permission that
2529      *               a receiver must hold in order to receive your broadcast.
2530      *               If null, no permission is required.
2531      * @param appOp The app op associated with the broadcast.
2532      *
2533      * @see #sendBroadcast(Intent, String)
2534      *
2535      * @hide
2536      */
2537     @SuppressWarnings("HiddenAbstractMethod")
2538     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
2539     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
sendBroadcastAsUser(@equiresPermission Intent intent, UserHandle user, @Nullable String receiverPermission, int appOp)2540     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
2541             UserHandle user, @Nullable String receiverPermission, int appOp);
2542 
2543     /**
2544      * Version of
2545      * {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)}
2546      * that allows you to specify the
2547      * user the broadcast will be sent to.  This is not available to applications
2548      * that are not pre-installed on the system image.
2549      *
2550      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2551      *
2552      * @param intent The Intent to broadcast; all receivers matching this
2553      *               Intent will receive the broadcast.
2554      * @param user UserHandle to send the intent to.
2555      * @param receiverPermission String naming a permissions that
2556      *               a receiver must hold in order to receive your broadcast.
2557      *               If null, no permission is required.
2558      * @param resultReceiver Your own BroadcastReceiver to treat as the final
2559      *                       receiver of the broadcast.
2560      * @param scheduler A custom Handler with which to schedule the
2561      *                  resultReceiver callback; if null it will be
2562      *                  scheduled in the Context's main thread.
2563      * @param initialCode An initial value for the result code.  Often
2564      *                    Activity.RESULT_OK.
2565      * @param initialData An initial value for the result data.  Often
2566      *                    null.
2567      * @param initialExtras An initial value for the result extras.  Often
2568      *                      null.
2569      *
2570      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2571      */
2572     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
sendOrderedBroadcastAsUser(@equiresPermission Intent intent, UserHandle user, @Nullable String receiverPermission, BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2573     public abstract void sendOrderedBroadcastAsUser(@RequiresPermission Intent intent,
2574             UserHandle user, @Nullable String receiverPermission, BroadcastReceiver resultReceiver,
2575             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
2576             @Nullable  Bundle initialExtras);
2577 
2578     /**
2579      * Similar to above but takes an appOp as well, to enforce restrictions.
2580      * @see #sendOrderedBroadcastAsUser(Intent, UserHandle, String,
2581      *       BroadcastReceiver, Handler, int, String, Bundle)
2582      * @hide
2583      */
2584     @SuppressWarnings("HiddenAbstractMethod")
2585     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
2586     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, @Nullable String receiverPermission, int appOp, BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2587     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
2588             @Nullable String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
2589             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
2590             @Nullable  Bundle initialExtras);
2591 
2592     /**
2593      * Similar to above but takes an appOp as well, to enforce restrictions, and an options Bundle.
2594      * @see #sendOrderedBroadcastAsUser(Intent, UserHandle, String,
2595      *       BroadcastReceiver, Handler, int, String, Bundle)
2596      * @hide
2597      */
2598     @SuppressWarnings("HiddenAbstractMethod")
2599     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
2600     @UnsupportedAppUsage
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, @Nullable String receiverPermission, int appOp, @Nullable Bundle options, BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2601     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
2602             @Nullable String receiverPermission, int appOp, @Nullable Bundle options,
2603             BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode,
2604             @Nullable String initialData, @Nullable  Bundle initialExtras);
2605 
2606     /**
2607      * Version of
2608      * {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String,
2609      * Bundle)} that allows you to specify the App Op to enforce restrictions on which receivers
2610      * the broadcast will be sent to.
2611      *
2612      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2613      *
2614      * @param intent The Intent to broadcast; all receivers matching this
2615      *               Intent will receive the broadcast.
2616      * @param receiverPermission String naming a permissions that
2617      *               a receiver must hold in order to receive your broadcast.
2618      *               If null, no permission is required.
2619      * @param receiverAppOp The app op associated with the broadcast. If null, no appOp is
2620      *                      required. If both receiverAppOp and receiverPermission are non-null,
2621      *                      a receiver must have both of them to
2622      *                      receive the broadcast
2623      * @param resultReceiver Your own BroadcastReceiver to treat as the final
2624      *                       receiver of the broadcast.
2625      * @param scheduler A custom Handler with which to schedule the
2626      *                  resultReceiver callback; if null it will be
2627      *                  scheduled in the Context's main thread.
2628      * @param initialCode An initial value for the result code.  Often
2629      *                    Activity.RESULT_OK.
2630      * @param initialData An initial value for the result data.  Often
2631      *                    null.
2632      * @param initialExtras An initial value for the result extras.  Often
2633      *                      null.
2634      *
2635      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2636      */
sendOrderedBroadcast(@onNull Intent intent, @Nullable String receiverPermission, @Nullable String receiverAppOp, @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2637     public void sendOrderedBroadcast(@NonNull Intent intent, @Nullable String receiverPermission,
2638             @Nullable String receiverAppOp, @Nullable BroadcastReceiver resultReceiver,
2639             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
2640             @Nullable Bundle initialExtras) {
2641         throw new RuntimeException("Not implemented. Must override in a subclass.");
2642     }
2643 
2644     /**
2645      * Version of
2646      * {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String,
2647      * Bundle)} that allows you to specify the App Op to enforce restrictions on which receivers
2648      * the broadcast will be sent to as well as supply an optional sending options
2649      *
2650      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2651      *
2652      * @param intent The Intent to broadcast; all receivers matching this
2653      *               Intent will receive the broadcast.
2654      * @param receiverPermission String naming a permissions that
2655      *               a receiver must hold in order to receive your broadcast.
2656      *               If null, no permission is required.
2657      * @param receiverAppOp The app op associated with the broadcast. If null, no appOp is
2658      *                      required. If both receiverAppOp and receiverPermission are non-null,
2659      *                      a receiver must have both of them to
2660      *                      receive the broadcast
2661      * @param options (optional) Additional sending options, generated from a
2662      * {@link android.app.BroadcastOptions}.
2663      * @param resultReceiver Your own BroadcastReceiver to treat as the final
2664      *                       receiver of the broadcast.
2665      * @param scheduler A custom Handler with which to schedule the
2666      *                  resultReceiver callback; if null it will be
2667      *                  scheduled in the Context's main thread.
2668      * @param initialCode An initial value for the result code.  Often
2669      *                    Activity.RESULT_OK.
2670      * @param initialData An initial value for the result data.  Often
2671      *                    null.
2672      * @param initialExtras An initial value for the result extras.  Often
2673      *                      null.
2674      *
2675      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
2676      * @see android.app.BroadcastOptions
2677      * @hide
2678      */
sendOrderedBroadcast(@equiresPermission @onNull Intent intent, int initialCode, @Nullable String receiverPermission, @Nullable String receiverAppOp, @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler, @Nullable String initialData, @Nullable Bundle initialExtras, @Nullable Bundle options)2679     public void sendOrderedBroadcast(@RequiresPermission @NonNull Intent intent, int initialCode,
2680             @Nullable String receiverPermission, @Nullable String receiverAppOp,
2681             @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler,
2682             @Nullable String initialData, @Nullable Bundle initialExtras,
2683             @Nullable Bundle options) {
2684         throw new RuntimeException("Not implemented. Must override in a subclass.");
2685     }
2686 
2687     /**
2688      * <p>Perform a {@link #sendBroadcast(Intent)} that is "sticky," meaning the
2689      * Intent you are sending stays around after the broadcast is complete,
2690      * so that others can quickly retrieve that data through the return
2691      * value of {@link #registerReceiver(BroadcastReceiver, IntentFilter)}.  In
2692      * all other ways, this behaves the same as
2693      * {@link #sendBroadcast(Intent)}.
2694      *
2695      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
2696      * can access them), no protection (anyone can modify them), and many other problems.
2697      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
2698      * has changed, with another mechanism for apps to retrieve the current value whenever
2699      * desired.
2700      *
2701      * @param intent The Intent to broadcast; all receivers matching this
2702      * Intent will receive the broadcast, and the Intent will be held to
2703      * be re-broadcast to future receivers.
2704      *
2705      * @see #sendBroadcast(Intent)
2706      * @see #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
2707      */
2708     @Deprecated
2709     @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY)
sendStickyBroadcast(@equiresPermission Intent intent)2710     public abstract void sendStickyBroadcast(@RequiresPermission Intent intent);
2711 
2712     /**
2713      * <p>Perform a {@link #sendBroadcast(Intent)} that is "sticky," meaning the
2714      * Intent you are sending stays around after the broadcast is complete,
2715      * so that others can quickly retrieve that data through the return
2716      * value of {@link #registerReceiver(BroadcastReceiver, IntentFilter)}.  In
2717      * all other ways, this behaves the same as
2718      * {@link #sendBroadcast(Intent)}.
2719      *
2720      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
2721      * can access them), no protection (anyone can modify them), and many other problems.
2722      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
2723      * has changed, with another mechanism for apps to retrieve the current value whenever
2724      * desired.
2725      *
2726      * @param intent The Intent to broadcast; all receivers matching this
2727      * Intent will receive the broadcast, and the Intent will be held to
2728      * be re-broadcast to future receivers.
2729      * @param options (optional) Additional sending options, generated from a
2730      * {@link android.app.BroadcastOptions}.
2731      *
2732      * @see #sendBroadcast(Intent)
2733      * @see #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
2734      */
2735     @Deprecated
2736     @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY)
sendStickyBroadcast(@equiresPermission @onNull Intent intent, @Nullable Bundle options)2737     public void sendStickyBroadcast(@RequiresPermission @NonNull Intent intent,
2738             @Nullable Bundle options) {
2739         throw new RuntimeException("Not implemented. Must override in a subclass.");
2740     }
2741 
2742     /**
2743      * <p>Version of {@link #sendStickyBroadcast} that allows you to
2744      * receive data back from the broadcast.  This is accomplished by
2745      * supplying your own BroadcastReceiver when calling, which will be
2746      * treated as a final receiver at the end of the broadcast -- its
2747      * {@link BroadcastReceiver#onReceive} method will be called with
2748      * the result values collected from the other receivers.  The broadcast will
2749      * be serialized in the same way as calling
2750      * {@link #sendOrderedBroadcast(Intent, String)}.
2751      *
2752      * <p>Like {@link #sendBroadcast(Intent)}, this method is
2753      * asynchronous; it will return before
2754      * resultReceiver.onReceive() is called.  Note that the sticky data
2755      * stored is only the data you initially supply to the broadcast, not
2756      * the result of any changes made by the receivers.
2757      *
2758      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2759      *
2760      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
2761      * can access them), no protection (anyone can modify them), and many other problems.
2762      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
2763      * has changed, with another mechanism for apps to retrieve the current value whenever
2764      * desired.
2765      *
2766      * @param intent The Intent to broadcast; all receivers matching this
2767      *               Intent will receive the broadcast.
2768      * @param resultReceiver Your own BroadcastReceiver to treat as the final
2769      *                       receiver of the broadcast.
2770      * @param scheduler A custom Handler with which to schedule the
2771      *                  resultReceiver callback; if null it will be
2772      *                  scheduled in the Context's main thread.
2773      * @param initialCode An initial value for the result code.  Often
2774      *                    Activity.RESULT_OK.
2775      * @param initialData An initial value for the result data.  Often
2776      *                    null.
2777      * @param initialExtras An initial value for the result extras.  Often
2778      *                      null.
2779      *
2780      * @see #sendBroadcast(Intent)
2781      * @see #sendBroadcast(Intent, String)
2782      * @see #sendOrderedBroadcast(Intent, String)
2783      * @see #sendStickyBroadcast(Intent)
2784      * @see android.content.BroadcastReceiver
2785      * @see #registerReceiver
2786      * @see android.app.Activity#RESULT_OK
2787      */
2788     @Deprecated
2789     @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY)
sendStickyOrderedBroadcast(@equiresPermission Intent intent, BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2790     public abstract void sendStickyOrderedBroadcast(@RequiresPermission Intent intent,
2791             BroadcastReceiver resultReceiver,
2792             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
2793             @Nullable Bundle initialExtras);
2794 
2795     /**
2796      * <p>Remove the data previously sent with {@link #sendStickyBroadcast},
2797      * so that it is as if the sticky broadcast had never happened.
2798      *
2799      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
2800      * can access them), no protection (anyone can modify them), and many other problems.
2801      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
2802      * has changed, with another mechanism for apps to retrieve the current value whenever
2803      * desired.
2804      *
2805      * @param intent The Intent that was previously broadcast.
2806      *
2807      * @see #sendStickyBroadcast
2808      */
2809     @Deprecated
2810     @RequiresPermission(android.Manifest.permission.BROADCAST_STICKY)
removeStickyBroadcast(@equiresPermission Intent intent)2811     public abstract void removeStickyBroadcast(@RequiresPermission Intent intent);
2812 
2813     /**
2814      * <p>Version of {@link #sendStickyBroadcast(Intent)} that allows you to specify the
2815      * user the broadcast will be sent to.  This is not available to applications
2816      * that are not pre-installed on the system image.
2817      *
2818      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
2819      * can access them), no protection (anyone can modify them), and many other problems.
2820      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
2821      * has changed, with another mechanism for apps to retrieve the current value whenever
2822      * desired.
2823      *
2824      * @param intent The Intent to broadcast; all receivers matching this
2825      * Intent will receive the broadcast, and the Intent will be held to
2826      * be re-broadcast to future receivers.
2827      * @param user UserHandle to send the intent to.
2828      *
2829      * @see #sendBroadcast(Intent)
2830      */
2831     @Deprecated
2832     @RequiresPermission(allOf = {
2833             android.Manifest.permission.INTERACT_ACROSS_USERS,
2834             android.Manifest.permission.BROADCAST_STICKY
2835     })
sendStickyBroadcastAsUser(@equiresPermission Intent intent, UserHandle user)2836     public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent,
2837             UserHandle user);
2838 
2839     /**
2840      * @hide
2841      * This is just here for sending CONNECTIVITY_ACTION.
2842      */
2843     @SuppressWarnings("HiddenAbstractMethod")
2844     @Deprecated
2845     @RequiresPermission(allOf = {
2846             android.Manifest.permission.INTERACT_ACROSS_USERS,
2847             android.Manifest.permission.BROADCAST_STICKY
2848     })
sendStickyBroadcastAsUser(@equiresPermission Intent intent, UserHandle user, Bundle options)2849     public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent,
2850             UserHandle user, Bundle options);
2851 
2852     /**
2853      * <p>Version of
2854      * {@link #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)}
2855      * that allows you to specify the
2856      * user the broadcast will be sent to.  This is not available to applications
2857      * that are not pre-installed on the system image.
2858      *
2859      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2860      *
2861      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
2862      * can access them), no protection (anyone can modify them), and many other problems.
2863      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
2864      * has changed, with another mechanism for apps to retrieve the current value whenever
2865      * desired.
2866      *
2867      * @param intent The Intent to broadcast; all receivers matching this
2868      *               Intent will receive the broadcast.
2869      * @param user UserHandle to send the intent to.
2870      * @param resultReceiver Your own BroadcastReceiver to treat as the final
2871      *                       receiver of the broadcast.
2872      * @param scheduler A custom Handler with which to schedule the
2873      *                  resultReceiver callback; if null it will be
2874      *                  scheduled in the Context's main thread.
2875      * @param initialCode An initial value for the result code.  Often
2876      *                    Activity.RESULT_OK.
2877      * @param initialData An initial value for the result data.  Often
2878      *                    null.
2879      * @param initialExtras An initial value for the result extras.  Often
2880      *                      null.
2881      *
2882      * @see #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
2883      */
2884     @Deprecated
2885     @RequiresPermission(allOf = {
2886             android.Manifest.permission.INTERACT_ACROSS_USERS,
2887             android.Manifest.permission.BROADCAST_STICKY
2888     })
sendStickyOrderedBroadcastAsUser(@equiresPermission Intent intent, UserHandle user, BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras)2889     public abstract void sendStickyOrderedBroadcastAsUser(@RequiresPermission Intent intent,
2890             UserHandle user, BroadcastReceiver resultReceiver,
2891             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
2892             @Nullable Bundle initialExtras);
2893 
2894     /**
2895      * <p>Version of {@link #removeStickyBroadcast(Intent)} that allows you to specify the
2896      * user the broadcast will be sent to.  This is not available to applications
2897      * that are not pre-installed on the system image.
2898      *
2899      * <p>You must hold the {@link android.Manifest.permission#BROADCAST_STICKY}
2900      * permission in order to use this API.  If you do not hold that
2901      * permission, {@link SecurityException} will be thrown.
2902      *
2903      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
2904      * can access them), no protection (anyone can modify them), and many other problems.
2905      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
2906      * has changed, with another mechanism for apps to retrieve the current value whenever
2907      * desired.
2908      *
2909      * @param intent The Intent that was previously broadcast.
2910      * @param user UserHandle to remove the sticky broadcast from.
2911      *
2912      * @see #sendStickyBroadcastAsUser
2913      */
2914     @Deprecated
2915     @RequiresPermission(allOf = {
2916             android.Manifest.permission.INTERACT_ACROSS_USERS,
2917             android.Manifest.permission.BROADCAST_STICKY
2918     })
removeStickyBroadcastAsUser(@equiresPermission Intent intent, UserHandle user)2919     public abstract void removeStickyBroadcastAsUser(@RequiresPermission Intent intent,
2920             UserHandle user);
2921 
2922     /**
2923      * Register a BroadcastReceiver to be run in the main activity thread.  The
2924      * <var>receiver</var> will be called with any broadcast Intent that
2925      * matches <var>filter</var>, in the main application thread.
2926      *
2927      * <p>The system may broadcast Intents that are "sticky" -- these stay
2928      * around after the broadcast has finished, to be sent to any later
2929      * registrations. If your IntentFilter matches one of these sticky
2930      * Intents, that Intent will be returned by this function
2931      * <strong>and</strong> sent to your <var>receiver</var> as if it had just
2932      * been broadcast.
2933      *
2934      * <p>There may be multiple sticky Intents that match <var>filter</var>,
2935      * in which case each of these will be sent to <var>receiver</var>.  In
2936      * this case, only one of these can be returned directly by the function;
2937      * which of these that is returned is arbitrarily decided by the system.
2938      *
2939      * <p>If you know the Intent your are registering for is sticky, you can
2940      * supply null for your <var>receiver</var>.  In this case, no receiver is
2941      * registered -- the function simply returns the sticky Intent that
2942      * matches <var>filter</var>.  In the case of multiple matches, the same
2943      * rules as described above apply.
2944      *
2945      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2946      *
2947      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
2948      * registered with this method will correctly respect the
2949      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
2950      * Prior to that, it would be ignored and delivered to all matching registered
2951      * receivers.  Be careful if using this for security.</p>
2952      *
2953      * <p class="note">Note: this method <em>cannot be called from a
2954      * {@link BroadcastReceiver} component;</em> that is, from a BroadcastReceiver
2955      * that is declared in an application's manifest.  It is okay, however, to call
2956      * this method from another BroadcastReceiver that has itself been registered
2957      * at run time with {@link #registerReceiver}, since the lifetime of such a
2958      * registered BroadcastReceiver is tied to the object that registered it.</p>
2959      *
2960      * @param receiver The BroadcastReceiver to handle the broadcast.
2961      * @param filter Selects the Intent broadcasts to be received.
2962      *
2963      * @return The first sticky intent found that matches <var>filter</var>,
2964      *         or null if there are none.
2965      *
2966      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
2967      * @see #sendBroadcast
2968      * @see #unregisterReceiver
2969      */
2970     @Nullable
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter)2971     public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
2972                                             IntentFilter filter);
2973 
2974     /**
2975      * Register to receive intent broadcasts, with the receiver optionally being
2976      * exposed to Instant Apps. See
2977      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)} for more
2978      * information. By default Instant Apps cannot interact with receivers in other
2979      * applications, this allows you to expose a receiver that Instant Apps can
2980      * interact with.
2981      *
2982      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
2983      *
2984      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
2985      * registered with this method will correctly respect the
2986      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
2987      * Prior to that, it would be ignored and delivered to all matching registered
2988      * receivers.  Be careful if using this for security.</p>
2989      *
2990      * @param receiver The BroadcastReceiver to handle the broadcast.
2991      * @param filter Selects the Intent broadcasts to be received.
2992      * @param flags Additional options for the receiver. May be 0 or
2993      *      {@link #RECEIVER_VISIBLE_TO_INSTANT_APPS}.
2994      *
2995      * @return The first sticky intent found that matches <var>filter</var>,
2996      *         or null if there are none.
2997      *
2998      * @see #registerReceiver(BroadcastReceiver, IntentFilter)
2999      * @see #sendBroadcast
3000      * @see #unregisterReceiver
3001      */
3002     @Nullable
registerReceiver(@ullable BroadcastReceiver receiver, IntentFilter filter, @RegisterReceiverFlags int flags)3003     public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
3004                                             IntentFilter filter,
3005                                             @RegisterReceiverFlags int flags);
3006 
3007     /**
3008      * Register to receive intent broadcasts, to run in the context of
3009      * <var>scheduler</var>.  See
3010      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)} for more
3011      * information.  This allows you to enforce permissions on who can
3012      * broadcast intents to your receiver, or have the receiver run in
3013      * a different thread than the main application thread.
3014      *
3015      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
3016      *
3017      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
3018      * registered with this method will correctly respect the
3019      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
3020      * Prior to that, it would be ignored and delivered to all matching registered
3021      * receivers.  Be careful if using this for security.</p>
3022      *
3023      * @param receiver The BroadcastReceiver to handle the broadcast.
3024      * @param filter Selects the Intent broadcasts to be received.
3025      * @param broadcastPermission String naming a permissions that a
3026      *      broadcaster must hold in order to send an Intent to you.  If null,
3027      *      no permission is required.
3028      * @param scheduler Handler identifying the thread that will receive
3029      *      the Intent.  If null, the main thread of the process will be used.
3030      *
3031      * @return The first sticky intent found that matches <var>filter</var>,
3032      *         or null if there are none.
3033      *
3034      * @see #registerReceiver(BroadcastReceiver, IntentFilter)
3035      * @see #sendBroadcast
3036      * @see #unregisterReceiver
3037      */
3038     @Nullable
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)3039     public abstract Intent registerReceiver(BroadcastReceiver receiver,
3040             IntentFilter filter, @Nullable String broadcastPermission,
3041             @Nullable Handler scheduler);
3042 
3043     /**
3044      * Register to receive intent broadcasts, to run in the context of
3045      * <var>scheduler</var>. See
3046      * {@link #registerReceiver(BroadcastReceiver, IntentFilter, int)} and
3047      * {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)}
3048      * for more information.
3049      *
3050      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
3051      *
3052      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
3053      * registered with this method will correctly respect the
3054      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
3055      * Prior to that, it would be ignored and delivered to all matching registered
3056      * receivers.  Be careful if using this for security.</p>
3057      *
3058      * @param receiver The BroadcastReceiver to handle the broadcast.
3059      * @param filter Selects the Intent broadcasts to be received.
3060      * @param broadcastPermission String naming a permissions that a
3061      *      broadcaster must hold in order to send an Intent to you.  If null,
3062      *      no permission is required.
3063      * @param scheduler Handler identifying the thread that will receive
3064      *      the Intent.  If null, the main thread of the process will be used.
3065      * @param flags Additional options for the receiver. May be 0 or
3066      *      {@link #RECEIVER_VISIBLE_TO_INSTANT_APPS}.
3067      *
3068      * @return The first sticky intent found that matches <var>filter</var>,
3069      *         or null if there are none.
3070      *
3071      * @see #registerReceiver(BroadcastReceiver, IntentFilter, int)
3072      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
3073      * @see #sendBroadcast
3074      * @see #unregisterReceiver
3075      */
3076     @Nullable
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, @RegisterReceiverFlags int flags)3077     public abstract Intent registerReceiver(BroadcastReceiver receiver,
3078             IntentFilter filter, @Nullable String broadcastPermission,
3079             @Nullable Handler scheduler, @RegisterReceiverFlags int flags);
3080 
3081     /**
3082      * Same as {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)}
3083      * but this receiver will receive broadcasts that are sent to all users. The receiver can
3084      * use {@link BroadcastReceiver#getSendingUser} to determine on which user the broadcast
3085      * was sent.
3086      *
3087      * @param receiver The BroadcastReceiver to handle the broadcast.
3088      * @param filter Selects the Intent broadcasts to be received.
3089      * @param broadcastPermission String naming a permissions that a
3090      *      broadcaster must hold in order to send an Intent to you. If {@code null},
3091      *      no permission is required.
3092      * @param scheduler Handler identifying the thread that will receive
3093      *      the Intent. If {@code null}, the main thread of the process will be used.
3094      *
3095      * @return The first sticky intent found that matches <var>filter</var>,
3096      *         or {@code null} if there are none.
3097      *
3098      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
3099      * @see #sendBroadcast
3100      * @see #unregisterReceiver
3101      * @hide
3102      */
3103     @Nullable
3104     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
3105     @SystemApi
registerReceiverForAllUsers(@ullable BroadcastReceiver receiver, @NonNull IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)3106     public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver,
3107             @NonNull IntentFilter filter, @Nullable String broadcastPermission,
3108             @Nullable Handler scheduler) {
3109         throw new RuntimeException("Not implemented. Must override in a subclass.");
3110     }
3111 
3112     /**
3113      * @hide
3114      * Same as {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
3115      * but for a specific user.  This receiver will receiver broadcasts that
3116      * are sent to the requested user.
3117      *
3118      * @param receiver The BroadcastReceiver to handle the broadcast.
3119      * @param user UserHandle to send the intent to.
3120      * @param filter Selects the Intent broadcasts to be received.
3121      * @param broadcastPermission String naming a permissions that a
3122      *      broadcaster must hold in order to send an Intent to you.  If null,
3123      *      no permission is required.
3124      * @param scheduler Handler identifying the thread that will receive
3125      *      the Intent.  If null, the main thread of the process will be used.
3126      *
3127      * @return The first sticky intent found that matches <var>filter</var>,
3128      *         or null if there are none.
3129      *
3130      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
3131      * @see #sendBroadcast
3132      * @see #unregisterReceiver
3133      */
3134     @SuppressWarnings("HiddenAbstractMethod")
3135     @Nullable
3136     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
3137     @UnsupportedAppUsage
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)3138     public abstract Intent registerReceiverAsUser(BroadcastReceiver receiver,
3139             UserHandle user, IntentFilter filter, @Nullable String broadcastPermission,
3140             @Nullable Handler scheduler);
3141 
3142     /**
3143      * Unregister a previously registered BroadcastReceiver.  <em>All</em>
3144      * filters that have been registered for this BroadcastReceiver will be
3145      * removed.
3146      *
3147      * @param receiver The BroadcastReceiver to unregister.
3148      *
3149      * @see #registerReceiver
3150      */
unregisterReceiver(BroadcastReceiver receiver)3151     public abstract void unregisterReceiver(BroadcastReceiver receiver);
3152 
3153     /**
3154      * Request that a given application service be started.  The Intent
3155      * should either contain the complete class name of a specific service
3156      * implementation to start, or a specific package name to target.  If the
3157      * Intent is less specified, it logs a warning about this.  In this case any of the
3158      * multiple matching services may be used.  If this service
3159      * is not already running, it will be instantiated and started (creating a
3160      * process for it if needed); if it is running then it remains running.
3161      *
3162      * <p>Every call to this method will result in a corresponding call to
3163      * the target service's {@link android.app.Service#onStartCommand} method,
3164      * with the <var>intent</var> given here.  This provides a convenient way
3165      * to submit jobs to a service without having to bind and call on to its
3166      * interface.
3167      *
3168      * <p>Using startService() overrides the default service lifetime that is
3169      * managed by {@link #bindService}: it requires the service to remain
3170      * running until {@link #stopService} is called, regardless of whether
3171      * any clients are connected to it.  Note that calls to startService()
3172      * do not nest: no matter how many times you call startService(),
3173      * a single call to {@link #stopService} will stop it.
3174      *
3175      * <p>The system attempts to keep running services around as much as
3176      * possible.  The only time they should be stopped is if the current
3177      * foreground application is using so many resources that the service needs
3178      * to be killed.  If any errors happen in the service's process, it will
3179      * automatically be restarted.
3180      *
3181      * <p>This function will throw {@link SecurityException} if you do not
3182      * have permission to start the given service.
3183      *
3184      * <div class="caution">
3185      * <p><strong>Note:</strong> Each call to startService()
3186      * results in significant work done by the system to manage service
3187      * lifecycle surrounding the processing of the intent, which can take
3188      * multiple milliseconds of CPU time. Due to this cost, startService()
3189      * should not be used for frequent intent delivery to a service, and only
3190      * for scheduling significant work. Use {@link #bindService bound services}
3191      * for high frequency calls.
3192      * </p>
3193      *
3194      * Beginning with SDK Version {@link android.os.Build.VERSION_CODES#O},
3195      * apps targeting SDK Version {@link android.os.Build.VERSION_CODES#O}
3196      * or higher are not allowed to start background services from the background.
3197      * See
3198      * <a href="{@docRoot}/about/versions/oreo/background">
3199      * Background Execution Limits</a>
3200      * for more details.
3201      *
3202      * <p><strong>Note:</strong>
3203      * Beginning with SDK Version {@link android.os.Build.VERSION_CODES#S},
3204      * apps targeting SDK Version {@link android.os.Build.VERSION_CODES#S}
3205      * or higher are not allowed to start foreground services from the background.
3206      * See
3207      * <a href="{@docRoot}/about/versions/12/behavior-changes-12">
3208      * Behavior changes: Apps targeting Android 12
3209      * </a>
3210      * for more details.
3211      * </div>
3212      *
3213      * @param service Identifies the service to be started.  The Intent must be
3214      *      fully explicit (supplying a component name).  Additional values
3215      *      may be included in the Intent extras to supply arguments along with
3216      *      this specific start call.
3217      *
3218      * @return If the service is being started or is already running, the
3219      * {@link ComponentName} of the actual service that was started is
3220      * returned; else if the service does not exist null is returned.
3221      *
3222      * @throws SecurityException If the caller does not have permission to access the service
3223      * or the service can not be found.
3224      * @throws IllegalStateException
3225      * Before Android {@link android.os.Build.VERSION_CODES#S},
3226      * if the application is in a state where the service
3227      * can not be started (such as not in the foreground in a state when services are allowed),
3228      * {@link IllegalStateException} was thrown.
3229      * @throws android.app.BackgroundServiceStartNotAllowedException
3230      * On Android {@link android.os.Build.VERSION_CODES#S} and later,
3231      * if the application is in a state where the service
3232      * can not be started (such as not in the foreground in a state when services are allowed),
3233      * {@link android.app.BackgroundServiceStartNotAllowedException} is thrown
3234      * This excemption extends {@link IllegalStateException}, so apps can
3235      * use {@code catch (IllegalStateException)} to catch both.
3236      *
3237      * @see #startForegroundService(Intent)
3238      * @see #stopService
3239      * @see #bindService
3240      */
3241     @Nullable
startService(Intent service)3242     public abstract ComponentName startService(Intent service);
3243 
3244     /**
3245      * Similar to {@link #startService(Intent)}, but with an implicit promise that the
3246      * Service will call {@link android.app.Service#startForeground(int, android.app.Notification)
3247      * startForeground(int, android.app.Notification)} once it begins running.  The service is given
3248      * an amount of time comparable to the ANR interval to do this, otherwise the system
3249      * will automatically stop the service and declare the app ANR.
3250      *
3251      * <p>Unlike the ordinary {@link #startService(Intent)}, this method can be used
3252      * at any time, regardless of whether the app hosting the service is in a foreground
3253      * state.
3254      *
3255      * <div class="caution">
3256      * <p><strong>Note:</strong>
3257      * Beginning with SDK Version {@link android.os.Build.VERSION_CODES#S},
3258      * apps targeting SDK Version {@link android.os.Build.VERSION_CODES#S}
3259      * or higher are not allowed to start foreground services from the background.
3260      * See
3261      * <a href="{@docRoot}/about/versions/12/behavior-changes-12">
3262      * Behavior changes: Apps targeting Android 12
3263      * </a>
3264      * for more details.
3265      * </div>
3266      *
3267      * @param service Identifies the service to be started.  The Intent must be
3268      *      fully explicit (supplying a component name).  Additional values
3269      *      may be included in the Intent extras to supply arguments along with
3270      *      this specific start call.
3271      *
3272      * @return If the service is being started or is already running, the
3273      * {@link ComponentName} of the actual service that was started is
3274      * returned; else if the service does not exist null is returned.
3275      *
3276      * @throws SecurityException If the caller does not have permission to access the service
3277      * or the service can not be found.
3278      *
3279      * @throws android.app.ForegroundServiceStartNotAllowedException
3280      * If the caller app's targeting API is
3281      * {@link android.os.Build.VERSION_CODES#S} or later, and the foreground service is restricted
3282      * from start due to background restriction.
3283      *
3284      * @see #stopService
3285      * @see android.app.Service#startForeground(int, android.app.Notification)
3286      */
3287     @Nullable
startForegroundService(Intent service)3288     public abstract ComponentName startForegroundService(Intent service);
3289 
3290     /**
3291      * @hide like {@link #startForegroundService(Intent)} but for a specific user.
3292      */
3293     @SuppressWarnings("HiddenAbstractMethod")
3294     @Nullable
3295     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
startForegroundServiceAsUser(Intent service, UserHandle user)3296     public abstract ComponentName startForegroundServiceAsUser(Intent service, UserHandle user);
3297 
3298     /**
3299      * Request that a given application service be stopped.  If the service is
3300      * not running, nothing happens.  Otherwise it is stopped.  Note that calls
3301      * to startService() are not counted -- this stops the service no matter
3302      * how many times it was started.
3303      *
3304      * <p>Note that if a stopped service still has {@link ServiceConnection}
3305      * objects bound to it with the {@link #BIND_AUTO_CREATE} set, it will
3306      * not be destroyed until all of these bindings are removed.  See
3307      * the {@link android.app.Service} documentation for more details on a
3308      * service's lifecycle.
3309      *
3310      * <p>This function will throw {@link SecurityException} if you do not
3311      * have permission to stop the given service.
3312      *
3313      * @param service Description of the service to be stopped.  The Intent must be either
3314      *      fully explicit (supplying a component name) or specify a specific package
3315      *      name it is targeted to.
3316      *
3317      * @return If there is a service matching the given Intent that is already
3318      * running, then it is stopped and {@code true} is returned; else {@code false} is returned.
3319      *
3320      * @throws SecurityException If the caller does not have permission to access the service
3321      * or the service can not be found.
3322      * @throws IllegalStateException If the application is in a state where the service
3323      * can not be started (such as not in the foreground in a state when services are allowed).
3324      *
3325      * @see #startService
3326      */
stopService(Intent service)3327     public abstract boolean stopService(Intent service);
3328 
3329     /**
3330      * @hide like {@link #startService(Intent)} but for a specific user.
3331      */
3332     @SuppressWarnings("HiddenAbstractMethod")
3333     @Nullable
3334     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
3335     @UnsupportedAppUsage
startServiceAsUser(Intent service, UserHandle user)3336     public abstract ComponentName startServiceAsUser(Intent service, UserHandle user);
3337 
3338     /**
3339      * @hide like {@link #stopService(Intent)} but for a specific user.
3340      */
3341     @SuppressWarnings("HiddenAbstractMethod")
3342     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
stopServiceAsUser(Intent service, UserHandle user)3343     public abstract boolean stopServiceAsUser(Intent service, UserHandle user);
3344 
3345     /**
3346      * Connect to an application service, creating it if needed.  This defines
3347      * a dependency between your application and the service.  The given
3348      * <var>conn</var> will receive the service object when it is created and be
3349      * told if it dies and restarts.  The service will be considered required
3350      * by the system only for as long as the calling context exists.  For
3351      * example, if this Context is an Activity that is stopped, the service will
3352      * not be required to continue running until the Activity is resumed.
3353      *
3354      * <p>If the service does not support binding, it may return {@code null} from
3355      * its {@link android.app.Service#onBind(Intent) onBind()} method.  If it does, then
3356      * the ServiceConnection's
3357      * {@link ServiceConnection#onNullBinding(ComponentName) onNullBinding()} method
3358      * will be invoked instead of
3359      * {@link ServiceConnection#onServiceConnected(ComponentName, IBinder) onServiceConnected()}.
3360      *
3361      * <p>This method will throw {@link SecurityException} if the calling app does not
3362      * have permission to bind to the given service.
3363      *
3364      * <p class="note">Note: this method <em>cannot be called from a
3365      * {@link BroadcastReceiver} component</em>.  A pattern you can use to
3366      * communicate from a BroadcastReceiver to a Service is to call
3367      * {@link #startService} with the arguments containing the command to be
3368      * sent, with the service calling its
3369      * {@link android.app.Service#stopSelf(int)} method when done executing
3370      * that command.  See the API demo App/Service/Service Start Arguments
3371      * Controller for an illustration of this.  It is okay, however, to use
3372      * this method from a BroadcastReceiver that has been registered with
3373      * {@link #registerReceiver}, since the lifetime of this BroadcastReceiver
3374      * is tied to another object (the one that registered it).</p>
3375      *
3376      * @param service Identifies the service to connect to.  The Intent must
3377      *      specify an explicit component name.
3378      * @param conn Receives information as the service is started and stopped.
3379      *      This must be a valid ServiceConnection object; it must not be null.
3380      * @param flags Operation options for the binding.  May be 0,
3381      *          {@link #BIND_AUTO_CREATE}, {@link #BIND_DEBUG_UNBIND},
3382      *          {@link #BIND_NOT_FOREGROUND}, {@link #BIND_ABOVE_CLIENT},
3383      *          {@link #BIND_ALLOW_OOM_MANAGEMENT}, {@link #BIND_WAIVE_PRIORITY}.
3384      *          {@link #BIND_IMPORTANT}, {@link #BIND_ADJUST_WITH_ACTIVITY},
3385      *          {@link #BIND_NOT_PERCEPTIBLE}, or {@link #BIND_INCLUDE_CAPABILITIES}.
3386      * @return {@code true} if the system is in the process of bringing up a
3387      *         service that your client has permission to bind to; {@code false}
3388      *         if the system couldn't find the service or if your client doesn't
3389      *         have permission to bind to it. If this value is {@code true}, you
3390      *         should later call {@link #unbindService} to release the
3391      *         connection.
3392      *
3393      * @throws SecurityException If the caller does not have permission to access the service
3394      * or the service can not be found.
3395      *
3396      * @see #unbindService
3397      * @see #startService
3398      * @see #BIND_AUTO_CREATE
3399      * @see #BIND_DEBUG_UNBIND
3400      * @see #BIND_NOT_FOREGROUND
3401      * @see #BIND_ABOVE_CLIENT
3402      * @see #BIND_ALLOW_OOM_MANAGEMENT
3403      * @see #BIND_WAIVE_PRIORITY
3404      * @see #BIND_IMPORTANT
3405      * @see #BIND_ADJUST_WITH_ACTIVITY
3406      * @see #BIND_NOT_PERCEPTIBLE
3407      * @see #BIND_INCLUDE_CAPABILITIES
3408      */
bindService(@equiresPermission Intent service, @NonNull ServiceConnection conn, @BindServiceFlags int flags)3409     public abstract boolean bindService(@RequiresPermission Intent service,
3410             @NonNull ServiceConnection conn, @BindServiceFlags int flags);
3411 
3412     /**
3413      * Same as {@link #bindService(Intent, ServiceConnection, int)} with executor to control
3414      * ServiceConnection callbacks.
3415      * @param executor Callbacks on ServiceConnection will be called on executor. Must use same
3416      *      instance for the same instance of ServiceConnection.
3417      */
bindService(@equiresPermission @onNull Intent service, @BindServiceFlags int flags, @NonNull @CallbackExecutor Executor executor, @NonNull ServiceConnection conn)3418     public boolean bindService(@RequiresPermission @NonNull Intent service,
3419             @BindServiceFlags int flags, @NonNull @CallbackExecutor Executor executor,
3420             @NonNull ServiceConnection conn) {
3421         throw new RuntimeException("Not implemented. Must override in a subclass.");
3422     }
3423 
3424     /**
3425      * Variation of {@link #bindService} that, in the specific case of isolated
3426      * services, allows the caller to generate multiple instances of a service
3427      * from a single component declaration.  In other words, you can use this to bind
3428      * to a service that has specified {@link android.R.attr#isolatedProcess} and, in
3429      * addition to the existing behavior of running in an isolated process, you can
3430      * also through the arguments here have the system bring up multiple concurrent
3431      * processes hosting their own instances of that service.  The <var>instanceName</var>
3432      * you provide here identifies the different instances, and you can use
3433      * {@link #updateServiceGroup(ServiceConnection, int, int)} to tell the system how it
3434      * should manage each of these instances.
3435      *
3436      * @param service Identifies the service to connect to.  The Intent must
3437      *      specify an explicit component name.
3438      * @param flags Operation options for the binding as per {@link #bindService}.
3439      * @param instanceName Unique identifier for the service instance.  Each unique
3440      *      name here will result in a different service instance being created.  Identifiers
3441      *      must only contain ASCII letters, digits, underscores, and periods.
3442      * @return Returns success of binding as per {@link #bindService}.
3443      * @param executor Callbacks on ServiceConnection will be called on executor.
3444      *      Must use same instance for the same instance of ServiceConnection.
3445      * @param conn Receives information as the service is started and stopped.
3446      *      This must be a valid ServiceConnection object; it must not be null.
3447      *
3448      * @throws SecurityException If the caller does not have permission to access the service
3449      * @throws IllegalArgumentException If the instanceName is invalid.
3450      *
3451      * @see #bindService
3452      * @see #updateServiceGroup
3453      * @see android.R.attr#isolatedProcess
3454      */
bindIsolatedService(@equiresPermission @onNull Intent service, @BindServiceFlags int flags, @NonNull String instanceName, @NonNull @CallbackExecutor Executor executor, @NonNull ServiceConnection conn)3455     public boolean bindIsolatedService(@RequiresPermission @NonNull Intent service,
3456             @BindServiceFlags int flags, @NonNull String instanceName,
3457             @NonNull @CallbackExecutor Executor executor, @NonNull ServiceConnection conn) {
3458         throw new RuntimeException("Not implemented. Must override in a subclass.");
3459     }
3460 
3461     /**
3462      * Binds to a service in the given {@code user} in the same manner as
3463      * {@link #bindService(Intent, ServiceConnection, int)}.
3464      *
3465      * <p>If the given {@code user} is in the same profile group and the target package is the
3466      * same as the caller, {@code android.Manifest.permission.INTERACT_ACROSS_PROFILES} is
3467      * sufficient. Otherwise, requires {@code android.Manifest.permission.INTERACT_ACROSS_USERS}
3468      * for interacting with other users.
3469      *
3470      * @param service Identifies the service to connect to.  The Intent must
3471      *      specify an explicit component name.
3472      * @param conn Receives information as the service is started and stopped.
3473      *      This must be a valid ServiceConnection object; it must not be null.
3474      * @param flags Operation options for the binding.  May be 0,
3475      *          {@link #BIND_AUTO_CREATE}, {@link #BIND_DEBUG_UNBIND},
3476      *          {@link #BIND_NOT_FOREGROUND}, {@link #BIND_ABOVE_CLIENT},
3477      *          {@link #BIND_ALLOW_OOM_MANAGEMENT}, {@link #BIND_WAIVE_PRIORITY}.
3478      *          {@link #BIND_IMPORTANT}, or
3479      *          {@link #BIND_ADJUST_WITH_ACTIVITY}.
3480      * @return {@code true} if the system is in the process of bringing up a
3481      *         service that your client has permission to bind to; {@code false}
3482      *         if the system couldn't find the service. If this value is {@code true}, you
3483      *         should later call {@link #unbindService} to release the
3484      *         connection.
3485      *
3486      * @throws SecurityException if the client does not have the required permission to bind.
3487      */
3488     @SuppressWarnings("unused")
3489     @RequiresPermission(anyOf = {
3490             android.Manifest.permission.INTERACT_ACROSS_USERS,
3491             android.Manifest.permission.INTERACT_ACROSS_PROFILES
3492     })
bindServiceAsUser( @onNull @equiresPermission Intent service, @NonNull ServiceConnection conn, int flags, @NonNull UserHandle user)3493     public boolean bindServiceAsUser(
3494             @NonNull @RequiresPermission Intent service, @NonNull ServiceConnection conn, int flags,
3495             @NonNull UserHandle user) {
3496         throw new RuntimeException("Not implemented. Must override in a subclass.");
3497     }
3498 
3499     /**
3500      * Same as {@link #bindServiceAsUser(Intent, ServiceConnection, int, UserHandle)}, but with an
3501      * explicit non-null Handler to run the ServiceConnection callbacks on.
3502      *
3503      * @hide
3504      */
3505     @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)
3506     @UnsupportedAppUsage(trackingBug = 136728678)
bindServiceAsUser(Intent service, ServiceConnection conn, int flags, Handler handler, UserHandle user)3507     public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
3508             Handler handler, UserHandle user) {
3509         throw new RuntimeException("Not implemented. Must override in a subclass.");
3510     }
3511 
3512     /**
3513      * For a service previously bound with {@link #bindService} or a related method, change
3514      * how the system manages that service's process in relation to other processes.  This
3515      * doesn't modify the original bind flags that were passed in when binding, but adjusts
3516      * how the process will be managed in some cases based on those flags.  Currently only
3517      * works on isolated processes (will be ignored for non-isolated processes).
3518      *
3519      * <p>Note that this call does not take immediate effect, but will be applied the next
3520      * time the impacted process is adjusted for some other reason.  Typically you would
3521      * call this before then calling a new {@link #bindIsolatedService} on the service
3522      * of interest, with that binding causing the process to be shuffled accordingly.</p>
3523      *
3524      * @param conn The connection interface previously supplied to bindService().  This
3525      *             parameter must not be null.
3526      * @param group A group to put this connection's process in.  Upon calling here, this
3527      *              will override any previous group that was set for that process.  The group
3528      *              tells the system about processes that are logically grouped together, so
3529      *              should be managed as one unit of importance (such as when being considered
3530      *              a recently used app).  All processes in the same app with the same group
3531      *              are considered to be related.  Supplying 0 reverts to the default behavior
3532      *              of not grouping.
3533      * @param importance Additional importance of the processes within a group.  Upon calling
3534      *                   here, this will override any previous importance that was set for that
3535      *                   process.  The most important process is 0, and higher values are
3536      *                   successively less important.  You can view this as describing how
3537      *                   to order the processes in an array, with the processes at the end of
3538      *                   the array being the least important.  This value has no meaning besides
3539      *                   indicating how processes should be ordered in that array one after the
3540      *                   other.  This provides a way to fine-tune the system's process killing,
3541      *                   guiding it to kill processes at the end of the array first.
3542      *
3543      * @see #bindIsolatedService
3544      */
updateServiceGroup(@onNull ServiceConnection conn, int group, int importance)3545     public void updateServiceGroup(@NonNull ServiceConnection conn, int group,
3546             int importance) {
3547         throw new RuntimeException("Not implemented. Must override in a subclass.");
3548     }
3549 
3550     /**
3551      * Disconnect from an application service.  You will no longer receive
3552      * calls as the service is restarted, and the service is now allowed to
3553      * stop at any time.
3554      *
3555      * @param conn The connection interface previously supplied to
3556      *             bindService().  This parameter must not be null.
3557      *
3558      * @see #bindService
3559      */
unbindService(@onNull ServiceConnection conn)3560     public abstract void unbindService(@NonNull ServiceConnection conn);
3561 
3562     /**
3563      * Start executing an {@link android.app.Instrumentation} class.  The given
3564      * Instrumentation component will be run by killing its target application
3565      * (if currently running), starting the target process, instantiating the
3566      * instrumentation component, and then letting it drive the application.
3567      *
3568      * <p>This function is not synchronous -- it returns as soon as the
3569      * instrumentation has started and while it is running.
3570      *
3571      * <p>Instrumentation is normally only allowed to run against a package
3572      * that is either unsigned or signed with a signature that the
3573      * the instrumentation package is also signed with (ensuring the target
3574      * trusts the instrumentation).
3575      *
3576      * @param className Name of the Instrumentation component to be run.
3577      * @param profileFile Optional path to write profiling data as the
3578      * instrumentation runs, or null for no profiling.
3579      * @param arguments Additional optional arguments to pass to the
3580      * instrumentation, or null.
3581      *
3582      * @return {@code true} if the instrumentation was successfully started,
3583      * else {@code false} if it could not be found.
3584      */
startInstrumentation(@onNull ComponentName className, @Nullable String profileFile, @Nullable Bundle arguments)3585     public abstract boolean startInstrumentation(@NonNull ComponentName className,
3586             @Nullable String profileFile, @Nullable Bundle arguments);
3587 
3588     /** @hide */
3589     @StringDef(suffix = { "_SERVICE" }, value = {
3590             POWER_SERVICE,
3591             //@hide: POWER_STATS_SERVICE,
3592             WINDOW_SERVICE,
3593             LAYOUT_INFLATER_SERVICE,
3594             ACCOUNT_SERVICE,
3595             ACTIVITY_SERVICE,
3596             ALARM_SERVICE,
3597             NOTIFICATION_SERVICE,
3598             ACCESSIBILITY_SERVICE,
3599             CAPTIONING_SERVICE,
3600             KEYGUARD_SERVICE,
3601             LOCATION_SERVICE,
3602             //@hide: COUNTRY_DETECTOR,
3603             SEARCH_SERVICE,
3604             SENSOR_SERVICE,
3605             SENSOR_PRIVACY_SERVICE,
3606             STORAGE_SERVICE,
3607             STORAGE_STATS_SERVICE,
3608             WALLPAPER_SERVICE,
3609             TIME_ZONE_RULES_MANAGER_SERVICE,
3610             VIBRATOR_MANAGER_SERVICE,
3611             VIBRATOR_SERVICE,
3612             //@hide: STATUS_BAR_SERVICE,
3613             CONNECTIVITY_SERVICE,
3614             PAC_PROXY_SERVICE,
3615             VCN_MANAGEMENT_SERVICE,
3616             //@hide: IP_MEMORY_STORE_SERVICE,
3617             IPSEC_SERVICE,
3618             VPN_MANAGEMENT_SERVICE,
3619             TEST_NETWORK_SERVICE,
3620             //@hide: UPDATE_LOCK_SERVICE,
3621             //@hide: NETWORKMANAGEMENT_SERVICE,
3622             NETWORK_STATS_SERVICE,
3623             //@hide: NETWORK_POLICY_SERVICE,
3624             WIFI_SERVICE,
3625             WIFI_AWARE_SERVICE,
3626             WIFI_P2P_SERVICE,
3627             WIFI_SCANNING_SERVICE,
3628             //@hide: LOWPAN_SERVICE,
3629             //@hide: WIFI_RTT_SERVICE,
3630             //@hide: ETHERNET_SERVICE,
3631             WIFI_RTT_RANGING_SERVICE,
3632             NSD_SERVICE,
3633             AUDIO_SERVICE,
3634             AUTH_SERVICE,
3635             FINGERPRINT_SERVICE,
3636             //@hide: FACE_SERVICE,
3637             BIOMETRIC_SERVICE,
3638             MEDIA_ROUTER_SERVICE,
3639             TELEPHONY_SERVICE,
3640             TELEPHONY_SUBSCRIPTION_SERVICE,
3641             CARRIER_CONFIG_SERVICE,
3642             EUICC_SERVICE,
3643             //@hide: MMS_SERVICE,
3644             TELECOM_SERVICE,
3645             CLIPBOARD_SERVICE,
3646             INPUT_METHOD_SERVICE,
3647             TEXT_SERVICES_MANAGER_SERVICE,
3648             TEXT_CLASSIFICATION_SERVICE,
3649             APPWIDGET_SERVICE,
3650             //@hide: VOICE_INTERACTION_MANAGER_SERVICE,
3651             //@hide: BACKUP_SERVICE,
3652             REBOOT_READINESS_SERVICE,
3653             ROLLBACK_SERVICE,
3654             DROPBOX_SERVICE,
3655             //@hide: DEVICE_IDLE_CONTROLLER,
3656             //@hide: POWER_WHITELIST_MANAGER,
3657             DEVICE_POLICY_SERVICE,
3658             UI_MODE_SERVICE,
3659             DOWNLOAD_SERVICE,
3660             NFC_SERVICE,
3661             BLUETOOTH_SERVICE,
3662             //@hide: SIP_SERVICE,
3663             USB_SERVICE,
3664             LAUNCHER_APPS_SERVICE,
3665             //@hide: SERIAL_SERVICE,
3666             //@hide: HDMI_CONTROL_SERVICE,
3667             INPUT_SERVICE,
3668             DISPLAY_SERVICE,
3669             //@hide COLOR_DISPLAY_SERVICE,
3670             USER_SERVICE,
3671             RESTRICTIONS_SERVICE,
3672             APP_OPS_SERVICE,
3673             ROLE_SERVICE,
3674             //@hide ROLE_CONTROLLER_SERVICE,
3675             CAMERA_SERVICE,
3676             //@hide: PLATFORM_COMPAT_SERVICE,
3677             //@hide: PLATFORM_COMPAT_NATIVE_SERVICE,
3678             PRINT_SERVICE,
3679             CONSUMER_IR_SERVICE,
3680             //@hide: TRUST_SERVICE,
3681             TV_INPUT_SERVICE,
3682             //@hide: TV_TUNER_RESOURCE_MGR_SERVICE,
3683             //@hide: NETWORK_SCORE_SERVICE,
3684             USAGE_STATS_SERVICE,
3685             MEDIA_SESSION_SERVICE,
3686             MEDIA_COMMUNICATION_SERVICE,
3687             BATTERY_SERVICE,
3688             JOB_SCHEDULER_SERVICE,
3689             //@hide: PERSISTENT_DATA_BLOCK_SERVICE,
3690             //@hide: OEM_LOCK_SERVICE,
3691             MEDIA_PROJECTION_SERVICE,
3692             MIDI_SERVICE,
3693             RADIO_SERVICE,
3694             HARDWARE_PROPERTIES_SERVICE,
3695             //@hide: SOUND_TRIGGER_SERVICE,
3696             SHORTCUT_SERVICE,
3697             //@hide: CONTEXTHUB_SERVICE,
3698             SYSTEM_HEALTH_SERVICE,
3699             //@hide: INCIDENT_SERVICE,
3700             //@hide: INCIDENT_COMPANION_SERVICE,
3701             //@hide: STATS_COMPANION_SERVICE,
3702             COMPANION_DEVICE_SERVICE,
3703             CROSS_PROFILE_APPS_SERVICE,
3704             //@hide: SYSTEM_UPDATE_SERVICE,
3705             //@hide: TIME_DETECTOR_SERVICE,
3706             //@hide: TIME_ZONE_DETECTOR_SERVICE,
3707             PERMISSION_SERVICE,
3708             LIGHTS_SERVICE,
3709             //@hide: PEOPLE_SERVICE,
3710             //@hide: DEVICE_STATE_SERVICE,
3711             //@hide: SPEECH_RECOGNITION_SERVICE,
3712             UWB_SERVICE,
3713             MEDIA_METRICS_SERVICE,
3714     })
3715     @Retention(RetentionPolicy.SOURCE)
3716     public @interface ServiceName {}
3717 
3718     /**
3719      * Return the handle to a system-level service by name. The class of the
3720      * returned object varies by the requested name. Currently available names
3721      * are:
3722      *
3723      * <dl>
3724      *  <dt> {@link #WINDOW_SERVICE} ("window")
3725      *  <dd> The top-level window manager in which you can place custom
3726      *  windows.  The returned object is a {@link android.view.WindowManager}. Must only be obtained
3727      *  from a visual context such as Activity or a Context created with
3728      *  {@link #createWindowContext(int, Bundle)}, which are adjusted to the configuration and
3729      *  visual bounds of an area on screen.
3730      *  <dt> {@link #LAYOUT_INFLATER_SERVICE} ("layout_inflater")
3731      *  <dd> A {@link android.view.LayoutInflater} for inflating layout resources
3732      *  in this context. Must only be obtained from a visual context such as Activity or a Context
3733      *  created with {@link #createWindowContext(int, Bundle)}, which are adjusted to the
3734      *  configuration and visual bounds of an area on screen.
3735      *  <dt> {@link #ACTIVITY_SERVICE} ("activity")
3736      *  <dd> A {@link android.app.ActivityManager} for interacting with the
3737      *  global activity state of the system.
3738      *  <dt> {@link #WALLPAPER_SERVICE} ("wallpaper")
3739      *  <dd> A {@link android.service.wallpaper.WallpaperService} for accessing wallpapers in this
3740      *  context. Must only be obtained from a visual context such as Activity or a Context created
3741      *  with {@link #createWindowContext(int, Bundle)}, which are adjusted to the configuration and
3742      *  visual bounds of an area on screen.
3743      *  <dt> {@link #POWER_SERVICE} ("power")
3744      *  <dd> A {@link android.os.PowerManager} for controlling power
3745      *  management.
3746      *  <dt> {@link #ALARM_SERVICE} ("alarm")
3747      *  <dd> A {@link android.app.AlarmManager} for receiving intents at the
3748      *  time of your choosing.
3749      *  <dt> {@link #NOTIFICATION_SERVICE} ("notification")
3750      *  <dd> A {@link android.app.NotificationManager} for informing the user
3751      *   of background events.
3752      *  <dt> {@link #KEYGUARD_SERVICE} ("keyguard")
3753      *  <dd> A {@link android.app.KeyguardManager} for controlling keyguard.
3754      *  <dt> {@link #LOCATION_SERVICE} ("location")
3755      *  <dd> A {@link android.location.LocationManager} for controlling location
3756      *   (e.g., GPS) updates.
3757      *  <dt> {@link #SEARCH_SERVICE} ("search")
3758      *  <dd> A {@link android.app.SearchManager} for handling search.
3759      *  <dt> {@link #VIBRATOR_MANAGER_SERVICE} ("vibrator_manager")
3760      *  <dd> A {@link android.os.VibratorManager} for accessing the device vibrators, interacting
3761      *  with individual ones and playing synchronized effects on multiple vibrators.
3762      *  <dt> {@link #VIBRATOR_SERVICE} ("vibrator")
3763      *  <dd> A {@link android.os.Vibrator} for interacting with the vibrator hardware.
3764      *  <dt> {@link #CONNECTIVITY_SERVICE} ("connectivity")
3765      *  <dd> A {@link android.net.ConnectivityManager ConnectivityManager} for
3766      *  handling management of network connections.
3767      *  <dt> {@link #IPSEC_SERVICE} ("ipsec")
3768      *  <dd> A {@link android.net.IpSecManager IpSecManager} for managing IPSec on
3769      *  sockets and networks.
3770      *  <dt> {@link #WIFI_SERVICE} ("wifi")
3771      *  <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of Wi-Fi
3772      *  connectivity.  On releases before NYC, it should only be obtained from an application
3773      *  context, and not from any other derived context to avoid memory leaks within the calling
3774      *  process.
3775      *  <dt> {@link #WIFI_AWARE_SERVICE} ("wifiaware")
3776      *  <dd> A {@link android.net.wifi.aware.WifiAwareManager WifiAwareManager} for management of
3777      * Wi-Fi Aware discovery and connectivity.
3778      *  <dt> {@link #WIFI_P2P_SERVICE} ("wifip2p")
3779      *  <dd> A {@link android.net.wifi.p2p.WifiP2pManager WifiP2pManager} for management of
3780      * Wi-Fi Direct connectivity.
3781      * <dt> {@link #INPUT_METHOD_SERVICE} ("input_method")
3782      * <dd> An {@link android.view.inputmethod.InputMethodManager InputMethodManager}
3783      * for management of input methods.
3784      * <dt> {@link #UI_MODE_SERVICE} ("uimode")
3785      * <dd> An {@link android.app.UiModeManager} for controlling UI modes.
3786      * <dt> {@link #DOWNLOAD_SERVICE} ("download")
3787      * <dd> A {@link android.app.DownloadManager} for requesting HTTP downloads
3788      * <dt> {@link #BATTERY_SERVICE} ("batterymanager")
3789      * <dd> A {@link android.os.BatteryManager} for managing battery state
3790      * <dt> {@link #JOB_SCHEDULER_SERVICE} ("taskmanager")
3791      * <dd>  A {@link android.app.job.JobScheduler} for managing scheduled tasks
3792      * <dt> {@link #NETWORK_STATS_SERVICE} ("netstats")
3793      * <dd> A {@link android.app.usage.NetworkStatsManager NetworkStatsManager} for querying network
3794      * usage statistics.
3795      * <dt> {@link #HARDWARE_PROPERTIES_SERVICE} ("hardware_properties")
3796      * <dd> A {@link android.os.HardwarePropertiesManager} for accessing hardware properties.
3797      * <dt> {@link #DOMAIN_VERIFICATION_SERVICE} ("domain_verification")
3798      * <dd> A {@link android.content.pm.verify.domain.DomainVerificationManager} for accessing
3799      * web domain approval state.
3800      * </dl>
3801      *
3802      * <p>Note:  System services obtained via this API may be closely associated with
3803      * the Context in which they are obtained from.  In general, do not share the
3804      * service objects between various different contexts (Activities, Applications,
3805      * Services, Providers, etc.)
3806      *
3807      * <p>Note: Instant apps, for which {@link PackageManager#isInstantApp()} returns true,
3808      * don't have access to the following system services: {@link #DEVICE_POLICY_SERVICE},
3809      * {@link #FINGERPRINT_SERVICE}, {@link #KEYGUARD_SERVICE}, {@link #SHORTCUT_SERVICE},
3810      * {@link #USB_SERVICE}, {@link #WALLPAPER_SERVICE}, {@link #WIFI_P2P_SERVICE},
3811      * {@link #WIFI_SERVICE}, {@link #WIFI_AWARE_SERVICE}. For these services this method will
3812      * return <code>null</code>.  Generally, if you are running as an instant app you should always
3813      * check whether the result of this method is {@code null}.
3814      *
3815      * <p>Note: When implementing this method, keep in mind that new services can be added on newer
3816      * Android releases, so if you're looking for just the explicit names mentioned above, make sure
3817      * to return {@code null} when you don't recognize the name &mdash; if you throw a
3818      * {@link RuntimeException} exception instead, you're app might break on new Android releases.
3819      *
3820      * @param name The name of the desired service.
3821      *
3822      * @return The service or {@code null} if the name does not exist.
3823      *
3824      * @see #WINDOW_SERVICE
3825      * @see android.view.WindowManager
3826      * @see #LAYOUT_INFLATER_SERVICE
3827      * @see android.view.LayoutInflater
3828      * @see #ACTIVITY_SERVICE
3829      * @see android.app.ActivityManager
3830      * @see #POWER_SERVICE
3831      * @see android.os.PowerManager
3832      * @see #ALARM_SERVICE
3833      * @see android.app.AlarmManager
3834      * @see #NOTIFICATION_SERVICE
3835      * @see android.app.NotificationManager
3836      * @see #KEYGUARD_SERVICE
3837      * @see android.app.KeyguardManager
3838      * @see #LOCATION_SERVICE
3839      * @see android.location.LocationManager
3840      * @see #SEARCH_SERVICE
3841      * @see android.app.SearchManager
3842      * @see #SENSOR_SERVICE
3843      * @see android.hardware.SensorManager
3844      * @see #STORAGE_SERVICE
3845      * @see android.os.storage.StorageManager
3846      * @see #VIBRATOR_MANAGER_SERVICE
3847      * @see android.os.VibratorManager
3848      * @see #VIBRATOR_SERVICE
3849      * @see android.os.Vibrator
3850      * @see #CONNECTIVITY_SERVICE
3851      * @see android.net.ConnectivityManager
3852      * @see #WIFI_SERVICE
3853      * @see android.net.wifi.WifiManager
3854      * @see #AUDIO_SERVICE
3855      * @see android.media.AudioManager
3856      * @see #MEDIA_ROUTER_SERVICE
3857      * @see android.media.MediaRouter
3858      * @see #TELEPHONY_SERVICE
3859      * @see android.telephony.TelephonyManager
3860      * @see #TELEPHONY_SUBSCRIPTION_SERVICE
3861      * @see android.telephony.SubscriptionManager
3862      * @see #CARRIER_CONFIG_SERVICE
3863      * @see android.telephony.CarrierConfigManager
3864      * @see #EUICC_SERVICE
3865      * @see android.telephony.euicc.EuiccManager
3866      * @see android.telephony.MmsManager
3867      * @see #INPUT_METHOD_SERVICE
3868      * @see android.view.inputmethod.InputMethodManager
3869      * @see #UI_MODE_SERVICE
3870      * @see android.app.UiModeManager
3871      * @see #DOWNLOAD_SERVICE
3872      * @see android.app.DownloadManager
3873      * @see #BATTERY_SERVICE
3874      * @see android.os.BatteryManager
3875      * @see #JOB_SCHEDULER_SERVICE
3876      * @see android.app.job.JobScheduler
3877      * @see #NETWORK_STATS_SERVICE
3878      * @see android.app.usage.NetworkStatsManager
3879      * @see android.os.HardwarePropertiesManager
3880      * @see #HARDWARE_PROPERTIES_SERVICE
3881      * @see #DOMAIN_VERIFICATION_SERVICE
3882      * @see android.content.pm.verify.domain.DomainVerificationManager
3883      */
getSystemService(@erviceName @onNull String name)3884     public abstract @Nullable Object getSystemService(@ServiceName @NonNull String name);
3885 
3886     /**
3887      * Return the handle to a system-level service by class.
3888      * <p>
3889      * Currently available classes are:
3890      * {@link android.view.WindowManager}, {@link android.view.LayoutInflater},
3891      * {@link android.app.ActivityManager}, {@link android.os.PowerManager},
3892      * {@link android.app.AlarmManager}, {@link android.app.NotificationManager},
3893      * {@link android.app.KeyguardManager}, {@link android.location.LocationManager},
3894      * {@link android.app.SearchManager}, {@link android.os.Vibrator},
3895      * {@link android.net.ConnectivityManager},
3896      * {@link android.net.wifi.WifiManager},
3897      * {@link android.media.AudioManager}, {@link android.media.MediaRouter},
3898      * {@link android.telephony.TelephonyManager}, {@link android.telephony.SubscriptionManager},
3899      * {@link android.view.inputmethod.InputMethodManager},
3900      * {@link android.app.UiModeManager}, {@link android.app.DownloadManager},
3901      * {@link android.os.BatteryManager}, {@link android.app.job.JobScheduler},
3902      * {@link android.app.usage.NetworkStatsManager},
3903      * {@link android.content.pm.verify.domain.DomainVerificationManager}.
3904      * </p>
3905      *
3906      * <p>
3907      * Note: System services obtained via this API may be closely associated with
3908      * the Context in which they are obtained from.  In general, do not share the
3909      * service objects between various different contexts (Activities, Applications,
3910      * Services, Providers, etc.)
3911      * </p>
3912      *
3913      * <p>Note: Instant apps, for which {@link PackageManager#isInstantApp()} returns true,
3914      * don't have access to the following system services: {@link #DEVICE_POLICY_SERVICE},
3915      * {@link #FINGERPRINT_SERVICE}, {@link #KEYGUARD_SERVICE}, {@link #SHORTCUT_SERVICE},
3916      * {@link #USB_SERVICE}, {@link #WALLPAPER_SERVICE}, {@link #WIFI_P2P_SERVICE},
3917      * {@link #WIFI_SERVICE}, {@link #WIFI_AWARE_SERVICE}. For these services this method will
3918      * return {@code null}. Generally, if you are running as an instant app you should always
3919      * check whether the result of this method is {@code null}.
3920      * </p>
3921      *
3922      * @param serviceClass The class of the desired service.
3923      * @return The service or {@code null} if the class is not a supported system service. Note:
3924      * <b>never</b> throw a {@link RuntimeException} if the name is not supported.
3925      */
3926     @SuppressWarnings("unchecked")
getSystemService(@onNull Class<T> serviceClass)3927     public final @Nullable <T> T getSystemService(@NonNull Class<T> serviceClass) {
3928         // Because subclasses may override getSystemService(String) we cannot
3929         // perform a lookup by class alone.  We must first map the class to its
3930         // service name then invoke the string-based method.
3931         String serviceName = getSystemServiceName(serviceClass);
3932         return serviceName != null ? (T)getSystemService(serviceName) : null;
3933     }
3934 
3935     /**
3936      * Gets the name of the system-level service that is represented by the specified class.
3937      *
3938      * @param serviceClass The class of the desired service.
3939      * @return The service name or null if the class is not a supported system service.
3940      */
getSystemServiceName(@onNull Class<?> serviceClass)3941     public abstract @Nullable String getSystemServiceName(@NonNull Class<?> serviceClass);
3942 
3943     /**
3944      * Use with {@link #getSystemService(String)} to retrieve a
3945      * {@link android.os.PowerManager} for controlling power management,
3946      * including "wake locks," which let you keep the device on while
3947      * you're running long tasks.
3948      */
3949     public static final String POWER_SERVICE = "power";
3950 
3951     /**
3952      * Use with {@link #getSystemService(String)} to retrieve a
3953      * {@link android.os.PowerStatsService} for accessing power stats
3954      * service.
3955      *
3956      * @see #getSystemService(String)
3957      * @hide
3958      */
3959     public static final String POWER_STATS_SERVICE = "powerstats";
3960 
3961     /**
3962      * Use with {@link #getSystemService(String)} to retrieve a
3963      * {@link android.os.RecoverySystem} for accessing the recovery system
3964      * service.
3965      *
3966      * @see #getSystemService(String)
3967      * @hide
3968      */
3969     public static final String RECOVERY_SERVICE = "recovery";
3970 
3971     /**
3972      * Use with {@link #getSystemService(String)} to retrieve a
3973      * {@link android.os.SystemUpdateManager} for accessing the system update
3974      * manager service.
3975      *
3976      * @see #getSystemService(String)
3977      * @hide
3978      */
3979     @SystemApi
3980     public static final String SYSTEM_UPDATE_SERVICE = "system_update";
3981 
3982     /**
3983      * Use with {@link #getSystemService(String)} to retrieve a
3984      * {@link android.view.WindowManager} for accessing the system's window
3985      * manager.
3986      *
3987      * @see #getSystemService(String)
3988      * @see android.view.WindowManager
3989      */
3990     @UiContext
3991     public static final String WINDOW_SERVICE = "window";
3992 
3993     /**
3994      * Use with {@link #getSystemService(String)} to retrieve a
3995      * {@link android.view.LayoutInflater} for inflating layout resources in this
3996      * context.
3997      *
3998      * @see #getSystemService(String)
3999      * @see android.view.LayoutInflater
4000      */
4001     @UiContext
4002     public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
4003 
4004     /**
4005      * Use with {@link #getSystemService(String)} to retrieve a
4006      * {@link android.accounts.AccountManager} for receiving intents at a
4007      * time of your choosing.
4008      *
4009      * @see #getSystemService(String)
4010      * @see android.accounts.AccountManager
4011      */
4012     public static final String ACCOUNT_SERVICE = "account";
4013 
4014     /**
4015      * Use with {@link #getSystemService(String)} to retrieve a
4016      * {@link android.app.ActivityManager} for interacting with the global
4017      * system state.
4018      *
4019      * @see #getSystemService(String)
4020      * @see android.app.ActivityManager
4021      */
4022     public static final String ACTIVITY_SERVICE = "activity";
4023 
4024     /**
4025      * Use with {@link #getSystemService(String)} to retrieve a
4026      * {@link android.app.ActivityTaskManager} for interacting with the global system state.
4027      *
4028      * @see #getSystemService(String)
4029      * @see android.app.ActivityTaskManager
4030      * @hide
4031      */
4032     public static final String ACTIVITY_TASK_SERVICE = "activity_task";
4033 
4034     /**
4035      * Use with {@link #getSystemService(String)} to retrieve a
4036      * {@link android.app.UriGrantsManager} for interacting with the global system state.
4037      *
4038      * @see #getSystemService(String)
4039      * @see android.app.UriGrantsManager
4040      * @hide
4041      */
4042     public static final String URI_GRANTS_SERVICE = "uri_grants";
4043 
4044     /**
4045      * Use with {@link #getSystemService(String)} to retrieve a
4046      * {@link android.app.AlarmManager} for receiving intents at a
4047      * time of your choosing.
4048      *
4049      * @see #getSystemService(String)
4050      * @see android.app.AlarmManager
4051      */
4052     public static final String ALARM_SERVICE = "alarm";
4053 
4054     /**
4055      * Use with {@link #getSystemService(String)} to retrieve a
4056      * {@link android.app.NotificationManager} for informing the user of
4057      * background events.
4058      *
4059      * @see #getSystemService(String)
4060      * @see android.app.NotificationManager
4061      */
4062     public static final String NOTIFICATION_SERVICE = "notification";
4063 
4064     /**
4065      * Use with {@link #getSystemService(String)} to retrieve a
4066      * {@link android.view.accessibility.AccessibilityManager} for giving the user
4067      * feedback for UI events through the registered event listeners.
4068      *
4069      * @see #getSystemService(String)
4070      * @see android.view.accessibility.AccessibilityManager
4071      */
4072     public static final String ACCESSIBILITY_SERVICE = "accessibility";
4073 
4074     /**
4075      * Use with {@link #getSystemService(String)} to retrieve a
4076      * {@link android.view.accessibility.CaptioningManager} for obtaining
4077      * captioning properties and listening for changes in captioning
4078      * preferences.
4079      *
4080      * @see #getSystemService(String)
4081      * @see android.view.accessibility.CaptioningManager
4082      */
4083     public static final String CAPTIONING_SERVICE = "captioning";
4084 
4085     /**
4086      * Use with {@link #getSystemService(String)} to retrieve a
4087      * {@link android.app.KeyguardManager} for controlling keyguard.
4088      *
4089      * @see #getSystemService(String)
4090      * @see android.app.KeyguardManager
4091      */
4092     public static final String KEYGUARD_SERVICE = "keyguard";
4093 
4094     /**
4095      * Use with {@link #getSystemService(String)} to retrieve a {@link
4096      * android.location.LocationManager} for controlling location
4097      * updates.
4098      *
4099      * @see #getSystemService(String)
4100      * @see android.location.LocationManager
4101      */
4102     public static final String LOCATION_SERVICE = "location";
4103 
4104     /**
4105      * Use with {@link #getSystemService(String)} to retrieve a
4106      * {@link android.location.CountryDetector} for detecting the country that
4107      * the user is in.
4108      *
4109      * @hide
4110      */
4111     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
4112     public static final String COUNTRY_DETECTOR = "country_detector";
4113 
4114     /**
4115      * Use with {@link #getSystemService(String)} to retrieve a {@link
4116      * android.app.SearchManager} for handling searches.
4117      *
4118      * <p>
4119      * {@link Configuration#UI_MODE_TYPE_WATCH} does not support
4120      * {@link android.app.SearchManager}.
4121      *
4122      * @see #getSystemService
4123      * @see android.app.SearchManager
4124      */
4125     public static final String SEARCH_SERVICE = "search";
4126 
4127     /**
4128      * Use with {@link #getSystemService(String)} to retrieve a {@link
4129      * android.hardware.SensorManager} for accessing sensors.
4130      *
4131      * @see #getSystemService(String)
4132      * @see android.hardware.SensorManager
4133      */
4134     public static final String SENSOR_SERVICE = "sensor";
4135 
4136     /**
4137      * Use with {@link #getSystemService(String)} to retrieve a {@link
4138      * android.hardware.SensorPrivacyManager} for accessing sensor privacy
4139      * functions.
4140      *
4141      * @see #getSystemService(String)
4142      * @see android.hardware.SensorPrivacyManager
4143      *
4144      * @hide
4145      */
4146     public static final String SENSOR_PRIVACY_SERVICE = "sensor_privacy";
4147 
4148     /**
4149      * Use with {@link #getSystemService(String)} to retrieve a {@link
4150      * android.os.storage.StorageManager} for accessing system storage
4151      * functions.
4152      *
4153      * @see #getSystemService(String)
4154      * @see android.os.storage.StorageManager
4155      */
4156     public static final String STORAGE_SERVICE = "storage";
4157 
4158     /**
4159      * Use with {@link #getSystemService(String)} to retrieve a {@link
4160      * android.app.usage.StorageStatsManager} for accessing system storage
4161      * statistics.
4162      *
4163      * @see #getSystemService(String)
4164      * @see android.app.usage.StorageStatsManager
4165      */
4166     public static final String STORAGE_STATS_SERVICE = "storagestats";
4167 
4168     /**
4169      * Use with {@link #getSystemService(String)} to retrieve a
4170      * com.android.server.WallpaperService for accessing wallpapers.
4171      *
4172      * @see #getSystemService(String)
4173      */
4174     @UiContext
4175     public static final String WALLPAPER_SERVICE = "wallpaper";
4176 
4177     /**
4178      * Use with {@link #getSystemService(String)} to retrieve a {@link android.os.VibratorManager}
4179      * for accessing the device vibrators, interacting with individual ones and playing synchronized
4180      * effects on multiple vibrators.
4181      *
4182      * @see #getSystemService(String)
4183      * @see android.os.VibratorManager
4184      */
4185     @SuppressLint("ServiceName")
4186     public static final String VIBRATOR_MANAGER_SERVICE = "vibrator_manager";
4187 
4188     /**
4189      * Use with {@link #getSystemService(String)} to retrieve a {@link android.os.Vibrator} for
4190      * interacting with the vibration hardware.
4191      *
4192      * @deprecated Use {@link android.os.VibratorManager} to retrieve the default system vibrator.
4193      * @see #getSystemService(String)
4194      * @see android.os.Vibrator
4195      */
4196     @Deprecated
4197     public static final String VIBRATOR_SERVICE = "vibrator";
4198 
4199     /**
4200      * Use with {@link #getSystemService(String)} to retrieve a {@link
4201      * android.app.StatusBarManager} for interacting with the status bar.
4202      *
4203      * @see #getSystemService(String)
4204      * @see android.app.StatusBarManager
4205      *
4206      * @hide
4207      */
4208     @SystemApi
4209     @SuppressLint("ServiceName")
4210     public static final String STATUS_BAR_SERVICE = "statusbar";
4211 
4212     /**
4213      * Use with {@link #getSystemService(String)} to retrieve a {@link
4214      * android.net.ConnectivityManager} for handling management of
4215      * network connections.
4216      *
4217      * @see #getSystemService(String)
4218      * @see android.net.ConnectivityManager
4219      */
4220     public static final String CONNECTIVITY_SERVICE = "connectivity";
4221 
4222     /**
4223      * Use with {@link #getSystemService(String)} to retrieve a {@link
4224      * android.net.PacProxyManager} for handling management of
4225      * pac proxy information.
4226      *
4227      * @see #getSystemService(String)
4228      * @see android.net.PacProxyManager
4229      * @hide
4230      */
4231     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
4232     public static final String PAC_PROXY_SERVICE = "pac_proxy";
4233 
4234     /**
4235      * Use with {@link #getSystemService(String)} to retrieve a {@link android.net.vcn.VcnManager}
4236      * for managing Virtual Carrier Networks
4237      *
4238      * @see #getSystemService(String)
4239      * @see android.net.vcn.VcnManager
4240      * @hide
4241      */
4242     public static final String VCN_MANAGEMENT_SERVICE = "vcn_management";
4243 
4244     /**
4245      * Use with {@link #getSystemService(String)} to retrieve a
4246      * {@link android.net.INetd} for communicating with the network stack
4247      * @hide
4248      * @see #getSystemService(String)
4249      * @hide
4250      */
4251     @SystemApi
4252     public static final String NETD_SERVICE = "netd";
4253 
4254     /**
4255      * Use with {@link android.os.ServiceManager.getService()} to retrieve a
4256      * {@link INetworkStackConnector} IBinder for communicating with the network stack
4257      * @hide
4258      * @see NetworkStackClient
4259      */
4260     public static final String NETWORK_STACK_SERVICE = "network_stack";
4261 
4262     /**
4263      * Use with {@link #getSystemService(String)} to retrieve a {@link android.net.TetheringManager}
4264      * for managing tethering functions.
4265      * @hide
4266      * @see android.net.TetheringManager
4267      */
4268     @SystemApi
4269     public static final String TETHERING_SERVICE = "tethering";
4270 
4271     /**
4272      * Use with {@link #getSystemService(String)} to retrieve a
4273      * {@link android.net.IpSecManager} for encrypting Sockets or Networks with
4274      * IPSec.
4275      *
4276      * @see #getSystemService(String)
4277      */
4278     public static final String IPSEC_SERVICE = "ipsec";
4279 
4280     /**
4281      * Use with {@link #getSystemService(String)} to retrieve a {@link android.net.VpnManager} to
4282      * manage profiles for the platform built-in VPN.
4283      *
4284      * @see #getSystemService(String)
4285      */
4286     public static final String VPN_MANAGEMENT_SERVICE = "vpn_management";
4287 
4288     /**
4289      * Use with {@link #getSystemService(String)} to retrieve a {@link
4290      * android.net.ConnectivityDiagnosticsManager} for performing network connectivity diagnostics
4291      * as well as receiving network connectivity information from the system.
4292      *
4293      * @see #getSystemService(String)
4294      * @see android.net.ConnectivityDiagnosticsManager
4295      */
4296     public static final String CONNECTIVITY_DIAGNOSTICS_SERVICE = "connectivity_diagnostics";
4297 
4298     /**
4299      * Use with {@link #getSystemService(String)} to retrieve a {@link
4300      * android.net.TestNetworkManager} for building TUNs and limited-use Networks
4301      *
4302      * @see #getSystemService(String)
4303      * @hide
4304      */
4305     @TestApi @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
4306     public static final String TEST_NETWORK_SERVICE = "test_network";
4307 
4308     /**
4309      * Use with {@link #getSystemService(String)} to retrieve a {@link
4310      * android.os.IUpdateLock} for managing runtime sequences that
4311      * must not be interrupted by headless OTA application or similar.
4312      *
4313      * @hide
4314      * @see #getSystemService(String)
4315      * @see android.os.UpdateLock
4316      */
4317     public static final String UPDATE_LOCK_SERVICE = "updatelock";
4318 
4319     /**
4320      * Constant for the internal network management service, not really a Context service.
4321      * @hide
4322      */
4323     public static final String NETWORKMANAGEMENT_SERVICE = "network_management";
4324 
4325     /**
4326      * Use with {@link #getSystemService(String)} to retrieve a
4327      * {@link com.android.server.slice.SliceManagerService} for managing slices.
4328      * @hide
4329      * @see #getSystemService(String)
4330      */
4331     public static final String SLICE_SERVICE = "slice";
4332 
4333     /**
4334      * Use with {@link #getSystemService(String)} to retrieve a {@link
4335      * android.app.usage.NetworkStatsManager} for querying network usage stats.
4336      *
4337      * @see #getSystemService(String)
4338      * @see android.app.usage.NetworkStatsManager
4339      */
4340     public static final String NETWORK_STATS_SERVICE = "netstats";
4341     /** {@hide} */
4342     public static final String NETWORK_POLICY_SERVICE = "netpolicy";
4343     /** {@hide} */
4344     public static final String NETWORK_WATCHLIST_SERVICE = "network_watchlist";
4345 
4346     /**
4347      * Use with {@link #getSystemService(String)} to retrieve a {@link
4348      * android.net.wifi.WifiManager} for handling management of
4349      * Wi-Fi access.
4350      *
4351      * @see #getSystemService(String)
4352      * @see android.net.wifi.WifiManager
4353      */
4354     public static final String WIFI_SERVICE = "wifi";
4355 
4356     /**
4357      * Use with {@link #getSystemService(String)} to retrieve a
4358      * {@link android.net.wifi.wificond.WifiNl80211Manager} for handling management of the
4359      * Wi-Fi nl802.11 daemon (wificond).
4360      *
4361      * @see #getSystemService(String)
4362      * @see android.net.wifi.wificond.WifiNl80211Manager
4363      * @hide
4364      */
4365     @SystemApi
4366     @SuppressLint("ServiceName")
4367     public static final String WIFI_NL80211_SERVICE = "wifinl80211";
4368 
4369     /**
4370      * Use with {@link #getSystemService(String)} to retrieve a {@link
4371      * android.net.wifi.p2p.WifiP2pManager} for handling management of
4372      * Wi-Fi peer-to-peer connections.
4373      *
4374      * @see #getSystemService(String)
4375      * @see android.net.wifi.p2p.WifiP2pManager
4376      */
4377     public static final String WIFI_P2P_SERVICE = "wifip2p";
4378 
4379     /**
4380      * Use with {@link #getSystemService(String)} to retrieve a
4381      * {@link android.net.wifi.aware.WifiAwareManager} for handling management of
4382      * Wi-Fi Aware.
4383      *
4384      * @see #getSystemService(String)
4385      * @see android.net.wifi.aware.WifiAwareManager
4386      */
4387     public static final String WIFI_AWARE_SERVICE = "wifiaware";
4388 
4389     /**
4390      * Use with {@link #getSystemService(String)} to retrieve a {@link
4391      * android.net.wifi.WifiScanner} for scanning the wifi universe
4392      *
4393      * @see #getSystemService(String)
4394      * @see android.net.wifi.WifiScanner
4395      * @hide
4396      */
4397     @SystemApi
4398     public static final String WIFI_SCANNING_SERVICE = "wifiscanner";
4399 
4400     /**
4401      * Use with {@link #getSystemService(String)} to retrieve a {@link
4402      * android.net.wifi.RttManager} for ranging devices with wifi
4403      *
4404      * @see #getSystemService(String)
4405      * @see android.net.wifi.RttManager
4406      * @hide
4407      */
4408     @SystemApi
4409     @Deprecated
4410     public static final String WIFI_RTT_SERVICE = "rttmanager";
4411 
4412     /**
4413      * Use with {@link #getSystemService(String)} to retrieve a {@link
4414      * android.net.wifi.rtt.WifiRttManager} for ranging devices with wifi.
4415      *
4416      * @see #getSystemService(String)
4417      * @see android.net.wifi.rtt.WifiRttManager
4418      */
4419     public static final String WIFI_RTT_RANGING_SERVICE = "wifirtt";
4420 
4421     /**
4422      * Use with {@link #getSystemService(String)} to retrieve a {@link
4423      * android.net.lowpan.LowpanManager} for handling management of
4424      * LoWPAN access.
4425      *
4426      * @see #getSystemService(String)
4427      * @see android.net.lowpan.LowpanManager
4428      *
4429      * @hide
4430      */
4431     public static final String LOWPAN_SERVICE = "lowpan";
4432 
4433     /**
4434      * Use with {@link #getSystemService(String)} to retrieve a {@link android.net.EthernetManager}
4435      * for handling management of Ethernet access.
4436      *
4437      * @see #getSystemService(String)
4438      * @see android.net.EthernetManager
4439      *
4440      * @hide
4441      */
4442     @SystemApi
4443     public static final String ETHERNET_SERVICE = "ethernet";
4444 
4445     /**
4446      * Use with {@link #getSystemService(String)} to retrieve a {@link
4447      * android.net.nsd.NsdManager} for handling management of network service
4448      * discovery
4449      *
4450      * @see #getSystemService(String)
4451      * @see android.net.nsd.NsdManager
4452      */
4453     public static final String NSD_SERVICE = "servicediscovery";
4454 
4455     /**
4456      * Use with {@link #getSystemService(String)} to retrieve a
4457      * {@link android.media.AudioManager} for handling management of volume,
4458      * ringer modes and audio routing.
4459      *
4460      * @see #getSystemService(String)
4461      * @see android.media.AudioManager
4462      */
4463     public static final String AUDIO_SERVICE = "audio";
4464 
4465     /**
4466      * Use with {@link #getSystemService(String)} to retrieve a {@link
4467      * android.media.MediaTranscodingManager} for transcoding media.
4468      *
4469      * @hide
4470      * @see #getSystemService(String)
4471      * @see android.media.MediaTranscodingManager
4472      */
4473     @SystemApi
4474     public static final String MEDIA_TRANSCODING_SERVICE = "media_transcoding";
4475 
4476     /**
4477      * AuthService orchestrates biometric and PIN/pattern/password authentication.
4478      *
4479      * BiometricService was split into two services, AuthService and BiometricService, where
4480      * AuthService is the high level service that orchestrates all types of authentication, and
4481      * BiometricService is a lower layer responsible only for biometric authentication.
4482      *
4483      * Ideally we should have renamed BiometricManager to AuthManager, because it logically
4484      * corresponds to AuthService. However, because BiometricManager is a public API, we kept
4485      * the old name but changed the internal implementation to use AuthService.
4486      *
4487      * As of now, the AUTH_SERVICE constant is only used to identify the service in
4488      * SystemServiceRegistry and SELinux. To obtain the manager for AUTH_SERVICE, one should use
4489      * BIOMETRIC_SERVICE with {@link #getSystemService(String)} to retrieve a
4490      * {@link android.hardware.biometrics.BiometricManager}
4491      *
4492      * Map of the two services and their managers:
4493      * [Service]            [Manager]
4494      * AuthService          BiometricManager
4495      * BiometricService     N/A
4496      *
4497      * @hide
4498      */
4499     public static final String AUTH_SERVICE = "auth";
4500 
4501     /**
4502      * Use with {@link #getSystemService(String)} to retrieve a
4503      * {@link android.hardware.fingerprint.FingerprintManager} for handling management
4504      * of fingerprints.
4505      *
4506      * @see #getSystemService(String)
4507      * @see android.hardware.fingerprint.FingerprintManager
4508      */
4509     public static final String FINGERPRINT_SERVICE = "fingerprint";
4510 
4511     /**
4512      * Use with {@link #getSystemService(String)} to retrieve a
4513      * {@link android.hardware.face.FaceManager} for handling management
4514      * of face authentication.
4515      *
4516      * @hide
4517      * @see #getSystemService
4518      * @see android.hardware.face.FaceManager
4519      */
4520     public static final String FACE_SERVICE = "face";
4521 
4522     /**
4523      * Use with {@link #getSystemService(String)} to retrieve a
4524      * {@link android.hardware.iris.IrisManager} for handling management
4525      * of iris authentication.
4526      *
4527      * @hide
4528      * @see #getSystemService
4529      * @see android.hardware.iris.IrisManager
4530      */
4531     public static final String IRIS_SERVICE = "iris";
4532 
4533     /**
4534      * Use with {@link #getSystemService(String)} to retrieve a
4535      * {@link android.hardware.biometrics.BiometricManager} for handling
4536      * biometric and PIN/pattern/password authentication.
4537      *
4538      * @see #getSystemService
4539      * @see android.hardware.biometrics.BiometricManager
4540      */
4541     public static final String BIOMETRIC_SERVICE = "biometric";
4542 
4543     /**
4544      * Use with {@link #getSystemService(String)} to retrieve a
4545      * {@link android.media.MediaCommunicationManager}
4546      * for managing {@link android.media.MediaSession2}.
4547      *
4548      * @see #getSystemService(String)
4549      * @see android.media.MediaCommunicationManager
4550      */
4551     public static final String MEDIA_COMMUNICATION_SERVICE = "media_communication";
4552 
4553     /**
4554      * Use with {@link #getSystemService} to retrieve a
4555      * {@link android.media.MediaRouter} for controlling and managing
4556      * routing of media.
4557      *
4558      * @see #getSystemService(String)
4559      * @see android.media.MediaRouter
4560      */
4561     public static final String MEDIA_ROUTER_SERVICE = "media_router";
4562 
4563     /**
4564      * Use with {@link #getSystemService(String)} to retrieve a
4565      * {@link android.media.session.MediaSessionManager} for managing media Sessions.
4566      *
4567      * @see #getSystemService(String)
4568      * @see android.media.session.MediaSessionManager
4569      */
4570     public static final String MEDIA_SESSION_SERVICE = "media_session";
4571 
4572     /**
4573      * Use with {@link #getSystemService(String)} to retrieve a
4574      * {@link android.telephony.TelephonyManager} for handling management the
4575      * telephony features of the device.
4576      *
4577      * @see #getSystemService(String)
4578      * @see android.telephony.TelephonyManager
4579      */
4580     public static final String TELEPHONY_SERVICE = "phone";
4581 
4582     /**
4583      * Use with {@link #getSystemService(String)} to retrieve a
4584      * {@link android.telephony.SubscriptionManager} for handling management the
4585      * telephony subscriptions of the device.
4586      *
4587      * @see #getSystemService(String)
4588      * @see android.telephony.SubscriptionManager
4589      */
4590     public static final String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
4591 
4592     /**
4593      * Use with {@link #getSystemService(String)} to retrieve a
4594      * {@link android.telecom.TelecomManager} to manage telecom-related features
4595      * of the device.
4596      *
4597      * @see #getSystemService(String)
4598      * @see android.telecom.TelecomManager
4599      */
4600     public static final String TELECOM_SERVICE = "telecom";
4601 
4602     /**
4603      * Use with {@link #getSystemService(String)} to retrieve a
4604      * {@link android.telephony.CarrierConfigManager} for reading carrier configuration values.
4605      *
4606      * @see #getSystemService(String)
4607      * @see android.telephony.CarrierConfigManager
4608      */
4609     public static final String CARRIER_CONFIG_SERVICE = "carrier_config";
4610 
4611     /**
4612      * Use with {@link #getSystemService(String)} to retrieve a
4613      * {@link android.telephony.euicc.EuiccManager} to manage the device eUICC (embedded SIM).
4614      *
4615      * @see #getSystemService(String)
4616      * @see android.telephony.euicc.EuiccManager
4617      */
4618     public static final String EUICC_SERVICE = "euicc";
4619 
4620     /**
4621      * Use with {@link #getSystemService(String)} to retrieve a
4622      * {@link android.telephony.euicc.EuiccCardManager} to access the device eUICC (embedded SIM).
4623      *
4624      * @see #getSystemService(String)
4625      * @see android.telephony.euicc.EuiccCardManager
4626      * @hide
4627      */
4628     @SystemApi
4629     public static final String EUICC_CARD_SERVICE = "euicc_card";
4630 
4631     /**
4632      * Use with {@link #getSystemService(String)} to retrieve a
4633      * {@link android.telephony.MmsManager} to send/receive MMS messages.
4634      *
4635      * @see #getSystemService(String)
4636      * @see android.telephony.MmsManager
4637      * @hide
4638      */
4639     public static final String MMS_SERVICE = "mms";
4640 
4641     /**
4642      * Use with {@link #getSystemService(String)} to retrieve a
4643      * {@link android.content.ClipboardManager} for accessing and modifying
4644      * the contents of the global clipboard.
4645      *
4646      * @see #getSystemService(String)
4647      * @see android.content.ClipboardManager
4648      */
4649     public static final String CLIPBOARD_SERVICE = "clipboard";
4650 
4651     /**
4652      * Use with {@link #getSystemService(String)} to retrieve a
4653      * {@link TextClassificationManager} for text classification services.
4654      *
4655      * @see #getSystemService(String)
4656      * @see TextClassificationManager
4657      */
4658     public static final String TEXT_CLASSIFICATION_SERVICE = "textclassification";
4659 
4660     /**
4661      * Use with {@link #getSystemService(String)} to retrieve a
4662      * {@link android.graphics.fonts.FontManager} for font services.
4663      *
4664      * @see #getSystemService(String)
4665      * @see android.graphics.fonts.FontManager
4666      * @hide
4667      */
4668     @SystemApi
4669     @TestApi
4670     public static final String FONT_SERVICE = "font";
4671 
4672     /**
4673      * Use with {@link #getSystemService(String)} to retrieve a
4674      * {@link com.android.server.attention.AttentionManagerService} for attention services.
4675      *
4676      * @see #getSystemService(String)
4677      * @see android.server.attention.AttentionManagerService
4678      * @hide
4679      */
4680     public static final String ATTENTION_SERVICE = "attention";
4681 
4682     /**
4683      * Official published name of the (internal) rotation resolver service.
4684      *
4685      * // TODO(b/178151184): change it back to rotation resolver before S release.
4686      *
4687      * @see #getSystemService(String)
4688      * @hide
4689      */
4690     public static final String ROTATION_RESOLVER_SERVICE = "resolver";
4691 
4692     /**
4693      * Use with {@link #getSystemService(String)} to retrieve a
4694      * {@link android.view.inputmethod.InputMethodManager} for accessing input
4695      * methods.
4696      *
4697      * @see #getSystemService(String)
4698      */
4699     public static final String INPUT_METHOD_SERVICE = "input_method";
4700 
4701     /**
4702      * Use with {@link #getSystemService(String)} to retrieve a
4703      * {@link android.view.textservice.TextServicesManager} for accessing
4704      * text services.
4705      *
4706      * @see #getSystemService(String)
4707      */
4708     public static final String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
4709 
4710     /**
4711      * Use with {@link #getSystemService(String)} to retrieve a
4712      * {@link android.appwidget.AppWidgetManager} for accessing AppWidgets.
4713      *
4714      * @see #getSystemService(String)
4715      */
4716     public static final String APPWIDGET_SERVICE = "appwidget";
4717 
4718     /**
4719      * Official published name of the (internal) voice interaction manager service.
4720      *
4721      * @hide
4722      * @see #getSystemService(String)
4723      */
4724     public static final String VOICE_INTERACTION_MANAGER_SERVICE = "voiceinteraction";
4725 
4726     /**
4727      * Official published name of the (internal) autofill service.
4728      *
4729      * @hide
4730      * @see #getSystemService(String)
4731      */
4732     public static final String AUTOFILL_MANAGER_SERVICE = "autofill";
4733 
4734     /**
4735      * Official published name of the (internal) text to speech manager service.
4736      *
4737      * @hide
4738      * @see #getSystemService(String)
4739      */
4740     public static final String TEXT_TO_SPEECH_MANAGER_SERVICE = "texttospeech";
4741 
4742     /**
4743      * Official published name of the content capture service.
4744      *
4745      * @hide
4746      * @see #getSystemService(String)
4747      */
4748     @TestApi
4749     @SuppressLint("ServiceName")  // TODO: This should be renamed to CONTENT_CAPTURE_SERVICE
4750     public static final String CONTENT_CAPTURE_MANAGER_SERVICE = "content_capture";
4751 
4752     /**
4753      * Official published name of the translation service.
4754      *
4755      * @hide
4756      * @see #getSystemService(String)
4757      */
4758     @SystemApi
4759     @SuppressLint("ServiceName")
4760     public static final String TRANSLATION_MANAGER_SERVICE = "translation";
4761 
4762     /**
4763      * Official published name of the translation service which supports ui translation function.
4764      *
4765      * @hide
4766      * @see #getSystemService(String)
4767      */
4768     @SystemApi
4769     public static final String UI_TRANSLATION_SERVICE = "ui_translation";
4770 
4771     /**
4772      * Used for getting content selections and classifications for task snapshots.
4773      *
4774      * @hide
4775      * @see #getSystemService(String)
4776      */
4777     @SystemApi
4778     public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions";
4779 
4780     /**
4781      * Official published name of the app prediction service.
4782      *
4783      * <p><b>NOTE: </b> this service is optional; callers of
4784      * {@code Context.getSystemServiceName(APP_PREDICTION_SERVICE)} should check for {@code null}.
4785      *
4786      * @hide
4787      * @see #getSystemService(String)
4788      */
4789     @SystemApi
4790     public static final String APP_PREDICTION_SERVICE = "app_prediction";
4791 
4792     /**
4793      * Official published name of the search ui service.
4794      *
4795      * <p><b>NOTE: </b> this service is optional; callers of
4796      * {@code Context.getSystemServiceName(SEARCH_UI_SERVICE)} should check for {@code null}.
4797      *
4798      * @hide
4799      * @see #getSystemService(String)
4800      */
4801     @SystemApi
4802     public static final String SEARCH_UI_SERVICE = "search_ui";
4803 
4804     /**
4805      * Used for getting the smartspace service.
4806      *
4807      * <p><b>NOTE: </b> this service is optional; callers of
4808      * {@code Context.getSystemServiceName(SMARTSPACE_SERVICE)} should check for {@code null}.
4809      *
4810      * @hide
4811      * @see #getSystemService(String)
4812      */
4813     @SystemApi
4814     public static final String SMARTSPACE_SERVICE = "smartspace";
4815 
4816     /**
4817      * Use with {@link #getSystemService(String)} to access the
4818      * {@link com.android.server.voiceinteraction.SoundTriggerService}.
4819      *
4820      * @hide
4821      * @see #getSystemService(String)
4822      */
4823     public static final String SOUND_TRIGGER_SERVICE = "soundtrigger";
4824 
4825     /**
4826      * Use with {@link #getSystemService(String)} to access the
4827      * {@link com.android.server.soundtrigger_middleware.SoundTriggerMiddlewareService}.
4828      *
4829      * @hide
4830      * @see #getSystemService(String)
4831      */
4832     public static final String SOUND_TRIGGER_MIDDLEWARE_SERVICE = "soundtrigger_middleware";
4833 
4834     /**
4835      * Used to access {@link MusicRecognitionManagerService}.
4836      *
4837      * @hide
4838      * @see #getSystemService(String)
4839      */
4840     @SystemApi
4841     public static final String MUSIC_RECOGNITION_SERVICE = "music_recognition";
4842 
4843     /**
4844      * Official published name of the (internal) permission service.
4845      *
4846      * @see #getSystemService(String)
4847      * @hide
4848      */
4849     @SystemApi
4850     public static final String PERMISSION_SERVICE = "permission";
4851 
4852     /**
4853      * Official published name of the legacy (internal) permission service.
4854      *
4855      * @see #getSystemService(String)
4856      * @hide
4857      */
4858     //@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
4859     public static final String LEGACY_PERMISSION_SERVICE = "legacy_permission";
4860 
4861     /**
4862      * Official published name of the (internal) permission controller service.
4863      *
4864      * @see #getSystemService(String)
4865      * @hide
4866      */
4867     @SystemApi
4868     public static final String PERMISSION_CONTROLLER_SERVICE = "permission_controller";
4869 
4870     /**
4871      * Official published name of the (internal) permission checker service.
4872      *
4873      * @see #getSystemService(String)
4874      * @hide
4875      */
4876     public static final String PERMISSION_CHECKER_SERVICE = "permission_checker";
4877 
4878     /**
4879      * Use with {@link #getSystemService(String) to retrieve an
4880      * {@link android.apphibernation.AppHibernationManager}} for
4881      * communicating with the hibernation service.
4882      * @hide
4883      *
4884      * @see #getSystemService(String)
4885      */
4886     @SystemApi
4887     public static final String APP_HIBERNATION_SERVICE = "app_hibernation";
4888 
4889     /**
4890      * Use with {@link #getSystemService(String)} to retrieve an
4891      * {@link android.app.backup.IBackupManager IBackupManager} for communicating
4892      * with the backup mechanism.
4893      * @hide
4894      *
4895      * @see #getSystemService(String)
4896      */
4897     @SystemApi
4898     public static final String BACKUP_SERVICE = "backup";
4899 
4900     /**
4901      * Use with {@link #getSystemService(String)} to retrieve an
4902      * {@link android.content.rollback.RollbackManager} for communicating
4903      * with the rollback manager
4904      *
4905      * @see #getSystemService(String)
4906      * @hide
4907      */
4908     @SystemApi
4909     public static final String ROLLBACK_SERVICE = "rollback";
4910 
4911     /**
4912      * Use with {@link #getSystemService(String)} to retrieve an
4913      * {@link android.scheduling.RebootReadinessManager} for communicating
4914      * with the reboot readiness detector.
4915      *
4916      * @see #getSystemService(String)
4917      * @hide
4918      */
4919     @SystemApi
4920     public static final String REBOOT_READINESS_SERVICE = "reboot_readiness";
4921 
4922     /**
4923      * Use with {@link #getSystemService(String)} to retrieve a
4924      * {@link android.os.DropBoxManager} instance for recording
4925      * diagnostic logs.
4926      * @see #getSystemService(String)
4927      */
4928     public static final String DROPBOX_SERVICE = "dropbox";
4929 
4930     /**
4931      * System service name for the DeviceIdleManager.
4932      * @see #getSystemService(String)
4933      * @hide
4934      */
4935     @TestApi
4936     @SuppressLint("ServiceName")  // TODO: This should be renamed to DEVICE_IDLE_SERVICE
4937     public static final String DEVICE_IDLE_CONTROLLER = "deviceidle";
4938 
4939     /**
4940      * System service name for the PowerWhitelistManager.
4941      *
4942      * @see #getSystemService(String)
4943      * @hide
4944      */
4945     @TestApi
4946     @Deprecated
4947     @SuppressLint("ServiceName")
4948     public static final String POWER_WHITELIST_MANAGER = "power_whitelist";
4949 
4950     /**
4951      * System service name for the PowerExemptionManager.
4952      *
4953      * @see #getSystemService(String)
4954      * @hide
4955      */
4956     @TestApi
4957     public static final String POWER_EXEMPTION_SERVICE = "power_exemption";
4958 
4959     /**
4960      * Use with {@link #getSystemService(String)} to retrieve a
4961      * {@link android.app.admin.DevicePolicyManager} for working with global
4962      * device policy management.
4963      *
4964      * @see #getSystemService(String)
4965      */
4966     public static final String DEVICE_POLICY_SERVICE = "device_policy";
4967 
4968     /**
4969      * Use with {@link #getSystemService(String)} to retrieve a
4970      * {@link android.app.UiModeManager} for controlling UI modes.
4971      *
4972      * @see #getSystemService(String)
4973      */
4974     public static final String UI_MODE_SERVICE = "uimode";
4975 
4976     /**
4977      * Use with {@link #getSystemService(String)} to retrieve a
4978      * {@link android.app.DownloadManager} for requesting HTTP downloads.
4979      *
4980      * @see #getSystemService(String)
4981      */
4982     public static final String DOWNLOAD_SERVICE = "download";
4983 
4984     /**
4985      * Use with {@link #getSystemService(String)} to retrieve a
4986      * {@link android.os.BatteryManager} for managing battery state.
4987      *
4988      * @see #getSystemService(String)
4989      */
4990     public static final String BATTERY_SERVICE = "batterymanager";
4991 
4992     /**
4993      * Use with {@link #getSystemService(String)} to retrieve a
4994      * {@link android.nfc.NfcManager} for using NFC.
4995      *
4996      * @see #getSystemService(String)
4997      */
4998     public static final String NFC_SERVICE = "nfc";
4999 
5000     /**
5001      * Use with {@link #getSystemService(String)} to retrieve a
5002      * {@link android.bluetooth.BluetoothManager} for using Bluetooth.
5003      *
5004      * @see #getSystemService(String)
5005      */
5006     public static final String BLUETOOTH_SERVICE = "bluetooth";
5007 
5008     /**
5009      * Use with {@link #getSystemService(String)} to retrieve a
5010      * {@link android.net.sip.SipManager} for accessing the SIP related service.
5011      *
5012      * @see #getSystemService(String)
5013      */
5014     /** @hide */
5015     public static final String SIP_SERVICE = "sip";
5016 
5017     /**
5018      * Use with {@link #getSystemService(String)} to retrieve a {@link
5019      * android.hardware.usb.UsbManager} for access to USB devices (as a USB host)
5020      * and for controlling this device's behavior as a USB device.
5021      *
5022      * @see #getSystemService(String)
5023      * @see android.hardware.usb.UsbManager
5024      */
5025     public static final String USB_SERVICE = "usb";
5026 
5027     /**
5028      * Use with {@link #getSystemService(String)} to retrieve a {@link
5029      * Use with {@link #getSystemService} to retrieve a {@link
5030      * android.debug.AdbManager} for access to ADB debug functions.
5031      *
5032      * @see #getSystemService(String)
5033      * @see android.debug.AdbManager
5034      *
5035      * @hide
5036      */
5037     public static final String ADB_SERVICE = "adb";
5038 
5039     /**
5040      * Use with {@link #getSystemService(String)} to retrieve a {@link
5041      * android.hardware.SerialManager} for access to serial ports.
5042      *
5043      * @see #getSystemService(String)
5044      * @see android.hardware.SerialManager
5045      *
5046      * @hide
5047      */
5048     public static final String SERIAL_SERVICE = "serial";
5049 
5050     /**
5051      * Use with {@link #getSystemService(String)} to retrieve a
5052      * {@link android.hardware.hdmi.HdmiControlManager} for controlling and managing
5053      * HDMI-CEC protocol.
5054      *
5055      * @see #getSystemService(String)
5056      * @see android.hardware.hdmi.HdmiControlManager
5057      * @hide
5058      */
5059     @SystemApi
5060     public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
5061 
5062     /**
5063      * Use with {@link #getSystemService(String)} to retrieve a
5064      * {@link android.hardware.input.InputManager} for interacting with input devices.
5065      *
5066      * @see #getSystemService(String)
5067      * @see android.hardware.input.InputManager
5068      */
5069     public static final String INPUT_SERVICE = "input";
5070 
5071     /**
5072      * Use with {@link #getSystemService(String)} to retrieve a
5073      * {@link android.hardware.display.DisplayManager} for interacting with display devices.
5074      *
5075      * @see #getSystemService(String)
5076      * @see android.hardware.display.DisplayManager
5077      */
5078     public static final String DISPLAY_SERVICE = "display";
5079 
5080     /**
5081      * Use with {@link #getSystemService(String)} to retrieve a
5082      * {@link android.hardware.display.ColorDisplayManager} for controlling color transforms.
5083      *
5084      * @see #getSystemService(String)
5085      * @see android.hardware.display.ColorDisplayManager
5086      * @hide
5087      */
5088     public static final String COLOR_DISPLAY_SERVICE = "color_display";
5089 
5090     /**
5091      * Use with {@link #getSystemService(String)} to retrieve a
5092      * {@link android.os.UserManager} for managing users on devices that support multiple users.
5093      *
5094      * @see #getSystemService(String)
5095      * @see android.os.UserManager
5096      */
5097     public static final String USER_SERVICE = "user";
5098 
5099     /**
5100      * Use with {@link #getSystemService(String)} to retrieve a
5101      * {@link android.content.pm.LauncherApps} for querying and monitoring launchable apps across
5102      * profiles of a user.
5103      *
5104      * @see #getSystemService(String)
5105      * @see android.content.pm.LauncherApps
5106      */
5107     public static final String LAUNCHER_APPS_SERVICE = "launcherapps";
5108 
5109     /**
5110      * Use with {@link #getSystemService(String)} to retrieve a
5111      * {@link android.content.RestrictionsManager} for retrieving application restrictions
5112      * and requesting permissions for restricted operations.
5113      * @see #getSystemService(String)
5114      * @see android.content.RestrictionsManager
5115      */
5116     public static final String RESTRICTIONS_SERVICE = "restrictions";
5117 
5118     /**
5119      * Use with {@link #getSystemService(String)} to retrieve a
5120      * {@link android.app.AppOpsManager} for tracking application operations
5121      * on the device.
5122      *
5123      * @see #getSystemService(String)
5124      * @see android.app.AppOpsManager
5125      */
5126     public static final String APP_OPS_SERVICE = "appops";
5127 
5128     /**
5129      * Use with {@link #getSystemService(String)} to retrieve a {@link android.app.role.RoleManager}
5130      * for managing roles.
5131      *
5132      * @see #getSystemService(String)
5133      * @see android.app.role.RoleManager
5134      */
5135     public static final String ROLE_SERVICE = "role";
5136 
5137     /**
5138      * Use with {@link #getSystemService(String)} to retrieve a
5139      * {@link android.hardware.camera2.CameraManager} for interacting with
5140      * camera devices.
5141      *
5142      * @see #getSystemService(String)
5143      * @see android.hardware.camera2.CameraManager
5144      */
5145     public static final String CAMERA_SERVICE = "camera";
5146 
5147     /**
5148      * {@link android.print.PrintManager} for printing and managing
5149      * printers and print tasks.
5150      *
5151      * @see #getSystemService(String)
5152      * @see android.print.PrintManager
5153      */
5154     public static final String PRINT_SERVICE = "print";
5155 
5156     /**
5157      * Use with {@link #getSystemService(String)} to retrieve a
5158      * {@link android.companion.CompanionDeviceManager} for managing companion devices
5159      *
5160      * @see #getSystemService(String)
5161      * @see android.companion.CompanionDeviceManager
5162      */
5163     public static final String COMPANION_DEVICE_SERVICE = "companiondevice";
5164 
5165     /**
5166      * Use with {@link #getSystemService(String)} to retrieve a
5167      * {@link android.hardware.ConsumerIrManager} for transmitting infrared
5168      * signals from the device.
5169      *
5170      * @see #getSystemService(String)
5171      * @see android.hardware.ConsumerIrManager
5172      */
5173     public static final String CONSUMER_IR_SERVICE = "consumer_ir";
5174 
5175     /**
5176      * {@link android.app.trust.TrustManager} for managing trust agents.
5177      * @see #getSystemService(String)
5178      * @see android.app.trust.TrustManager
5179      * @hide
5180      */
5181     public static final String TRUST_SERVICE = "trust";
5182 
5183     /**
5184      * Use with {@link #getSystemService(String)} to retrieve a
5185      * {@link android.media.tv.TvInputManager} for interacting with TV inputs
5186      * on the device.
5187      *
5188      * @see #getSystemService(String)
5189      * @see android.media.tv.TvInputManager
5190      */
5191     public static final String TV_INPUT_SERVICE = "tv_input";
5192 
5193     /**
5194      * Use with {@link #getSystemService(String)} to retrieve a
5195      * {@link android.media.tv.TunerResourceManager} for interacting with TV
5196      * tuner resources on the device.
5197      *
5198      * @see #getSystemService(String)
5199      * @see android.media.tv.TunerResourceManager
5200      * @hide
5201      */
5202     public static final String TV_TUNER_RESOURCE_MGR_SERVICE = "tv_tuner_resource_mgr";
5203 
5204     /**
5205      * {@link android.net.NetworkScoreManager} for managing network scoring.
5206      * @see #getSystemService(String)
5207      * @see android.net.NetworkScoreManager
5208      * @hide
5209      */
5210     @SystemApi
5211     public static final String NETWORK_SCORE_SERVICE = "network_score";
5212 
5213     /**
5214      * Use with {@link #getSystemService(String)} to retrieve a {@link
5215      * android.app.usage.UsageStatsManager} for querying device usage stats.
5216      *
5217      * @see #getSystemService(String)
5218      * @see android.app.usage.UsageStatsManager
5219      */
5220     public static final String USAGE_STATS_SERVICE = "usagestats";
5221 
5222     /**
5223      * Use with {@link #getSystemService(String)} to retrieve a {@link
5224      * android.app.job.JobScheduler} instance for managing occasional
5225      * background tasks.
5226      * @see #getSystemService(String)
5227      * @see android.app.job.JobScheduler
5228      */
5229     public static final String JOB_SCHEDULER_SERVICE = "jobscheduler";
5230 
5231     /**
5232      * Use with {@link #getSystemService(String)} to retrieve a {@link
5233      * android.service.persistentdata.PersistentDataBlockManager} instance
5234      * for interacting with a storage device that lives across factory resets.
5235      *
5236      * @see #getSystemService(String)
5237      * @see android.service.persistentdata.PersistentDataBlockManager
5238      * @hide
5239      */
5240     @SystemApi
5241     public static final String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
5242 
5243     /**
5244      * Use with {@link #getSystemService(String)} to retrieve a {@link
5245      * android.service.oemlock.OemLockManager} instance for managing the OEM lock.
5246      *
5247      * @see #getSystemService(String)
5248      * @see android.service.oemlock.OemLockManager
5249      * @hide
5250      */
5251     @SystemApi
5252     public static final String OEM_LOCK_SERVICE = "oem_lock";
5253 
5254     /**
5255      * Use with {@link #getSystemService(String)} to retrieve a {@link
5256      * android.media.projection.MediaProjectionManager} instance for managing
5257      * media projection sessions.
5258      * @see #getSystemService(String)
5259      * @see android.media.projection.MediaProjectionManager
5260      */
5261     public static final String MEDIA_PROJECTION_SERVICE = "media_projection";
5262 
5263     /**
5264      * Use with {@link #getSystemService(String)} to retrieve a
5265      * {@link android.media.midi.MidiManager} for accessing the MIDI service.
5266      *
5267      * @see #getSystemService(String)
5268      */
5269     public static final String MIDI_SERVICE = "midi";
5270 
5271 
5272     /**
5273      * Use with {@link #getSystemService(String)} to retrieve a
5274      * {@link android.hardware.radio.RadioManager} for accessing the broadcast radio service.
5275      *
5276      * @see #getSystemService(String)
5277      * @hide
5278      */
5279     public static final String RADIO_SERVICE = "broadcastradio";
5280 
5281     /**
5282      * Use with {@link #getSystemService(String)} to retrieve a
5283      * {@link android.os.HardwarePropertiesManager} for accessing the hardware properties service.
5284      *
5285      * @see #getSystemService(String)
5286      */
5287     public static final String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
5288 
5289     /**
5290      * Use with {@link #getSystemService(String)} to retrieve a
5291      * {@link android.os.ThermalService} for accessing the thermal service.
5292      *
5293      * @see #getSystemService(String)
5294      * @hide
5295      */
5296     public static final String THERMAL_SERVICE = "thermalservice";
5297 
5298     /**
5299      * Use with {@link #getSystemService(String)} to retrieve a
5300      * {@link android.os.PerformanceHintManager} for accessing the performance hinting service.
5301      *
5302      * @see #getSystemService(String)
5303      */
5304     public static final String PERFORMANCE_HINT_SERVICE = "performance_hint";
5305 
5306     /**
5307      * Use with {@link #getSystemService(String)} to retrieve a
5308      * {@link android.content.pm.ShortcutManager} for accessing the launcher shortcut service.
5309      *
5310      * @see #getSystemService(String)
5311      * @see android.content.pm.ShortcutManager
5312      */
5313     public static final String SHORTCUT_SERVICE = "shortcut";
5314 
5315     /**
5316      * Use with {@link #getSystemService(String)} to retrieve a {@link
5317      * android.hardware.location.ContextHubManager} for accessing context hubs.
5318      *
5319      * @see #getSystemService(String)
5320      * @see android.hardware.location.ContextHubManager
5321      *
5322      * @hide
5323      */
5324     @SystemApi
5325     public static final String CONTEXTHUB_SERVICE = "contexthub";
5326 
5327     /**
5328      * Use with {@link #getSystemService(String)} to retrieve a
5329      * {@link android.os.health.SystemHealthManager} for accessing system health (battery, power,
5330      * memory, etc) metrics.
5331      *
5332      * @see #getSystemService(String)
5333      */
5334     public static final String SYSTEM_HEALTH_SERVICE = "systemhealth";
5335 
5336     /**
5337      * Gatekeeper Service.
5338      * @hide
5339      */
5340     public static final String GATEKEEPER_SERVICE = "android.service.gatekeeper.IGateKeeperService";
5341 
5342     /**
5343      * Service defining the policy for access to device identifiers.
5344      * @hide
5345      */
5346     public static final String DEVICE_IDENTIFIERS_SERVICE = "device_identifiers";
5347 
5348     /**
5349      * Service to report a system health "incident"
5350      * @hide
5351      */
5352     public static final String INCIDENT_SERVICE = "incident";
5353 
5354     /**
5355      * Service to assist incidentd and dumpstated in reporting status to the user
5356      * and in confirming authorization to take an incident report or bugreport
5357      * @hide
5358      */
5359     public static final String INCIDENT_COMPANION_SERVICE = "incidentcompanion";
5360 
5361     /**
5362      * Service to assist {@link android.app.StatsManager} that lives in system server.
5363      * @hide
5364      */
5365     public static final String STATS_MANAGER_SERVICE = "statsmanager";
5366 
5367     /**
5368      * Service to assist statsd in obtaining general stats.
5369      * @hide
5370      */
5371     public static final String STATS_COMPANION_SERVICE = "statscompanion";
5372 
5373     /**
5374      * Use with {@link #getSystemService(String)} to retrieve an {@link android.app.StatsManager}.
5375      * @hide
5376      */
5377     @SystemApi
5378     public static final String STATS_MANAGER = "stats";
5379 
5380     /**
5381      * Use with {@link android.os.ServiceManager.getService()} to retrieve a
5382      * {@link IPlatformCompat} IBinder for communicating with the platform compat service.
5383      * @hide
5384      */
5385     public static final String PLATFORM_COMPAT_SERVICE = "platform_compat";
5386 
5387     /**
5388      * Use with {@link android.os.ServiceManager.getService()} to retrieve a
5389      * {@link IPlatformCompatNative} IBinder for native code communicating with the platform compat
5390      * service.
5391      * @hide
5392      */
5393     public static final String PLATFORM_COMPAT_NATIVE_SERVICE = "platform_compat_native";
5394 
5395     /**
5396      * Service to capture a bugreport.
5397      * @see #getSystemService(String)
5398      * @see android.os.BugreportManager
5399      */
5400     public static final String BUGREPORT_SERVICE = "bugreport";
5401 
5402     /**
5403      * Use with {@link #getSystemService(String)} to retrieve a {@link
5404      * android.content.om.OverlayManager} for managing overlay packages.
5405      *
5406      * @see #getSystemService(String)
5407      * @see android.content.om.OverlayManager
5408      * @hide
5409      */
5410     public static final String OVERLAY_SERVICE = "overlay";
5411 
5412     /**
5413      * Use with {@link #getSystemService(String)} to retrieve a
5414      * {android.os.IIdmap2} for managing idmap files (used by overlay
5415      * packages).
5416      *
5417      * @see #getSystemService(String)
5418      * @hide
5419      */
5420     public static final String IDMAP_SERVICE = "idmap";
5421 
5422     /**
5423      * Use with {@link #getSystemService(String)} to retrieve a
5424      * {@link VrManager} for accessing the VR service.
5425      *
5426      * @see #getSystemService(String)
5427      * @hide
5428      */
5429     @SystemApi
5430     public static final String VR_SERVICE = "vrmanager";
5431 
5432     /**
5433      * Use with {@link #getSystemService(String)} to retrieve an
5434      * {@link android.app.timezone.ITimeZoneRulesManager}.
5435      * @hide
5436      *
5437      * @see #getSystemService(String)
5438      */
5439     public static final String TIME_ZONE_RULES_MANAGER_SERVICE = "timezone";
5440 
5441     /**
5442      * Use with {@link #getSystemService(String)} to retrieve a
5443      * {@link android.content.pm.CrossProfileApps} for cross profile operations.
5444      *
5445      * @see #getSystemService(String)
5446      */
5447     public static final String CROSS_PROFILE_APPS_SERVICE = "crossprofileapps";
5448 
5449     /**
5450      * Use with {@link #getSystemService} to retrieve a
5451      * {@link android.se.omapi.ISecureElementService}
5452      * for accessing the SecureElementService.
5453      *
5454      * @hide
5455      */
5456     @SystemApi
5457     public static final String SECURE_ELEMENT_SERVICE = "secure_element";
5458 
5459     /**
5460      * Use with {@link #getSystemService(String)} to retrieve an
5461      * {@link android.app.timedetector.TimeDetector}.
5462      * @hide
5463      *
5464      * @see #getSystemService(String)
5465      */
5466     public static final String TIME_DETECTOR_SERVICE = "time_detector";
5467 
5468     /**
5469      * Use with {@link #getSystemService(String)} to retrieve an
5470      * {@link android.app.timezonedetector.TimeZoneDetector}.
5471      * @hide
5472      *
5473      * @see #getSystemService(String)
5474      */
5475     public static final String TIME_ZONE_DETECTOR_SERVICE = "time_zone_detector";
5476 
5477     /**
5478      * Use with {@link #getSystemService(String)} to retrieve an {@link TimeManager}.
5479      * @hide
5480      *
5481      * @see #getSystemService(String)
5482      */
5483     public static final String TIME_MANAGER = "time_manager";
5484 
5485     /**
5486      * Binder service name for {@link AppBindingService}.
5487      * @hide
5488      */
5489     public static final String APP_BINDING_SERVICE = "app_binding";
5490 
5491     /**
5492      * Use with {@link #getSystemService(String)} to retrieve an
5493      * {@link android.telephony.ims.ImsManager}.
5494      */
5495     public static final String TELEPHONY_IMS_SERVICE = "telephony_ims";
5496 
5497     /**
5498      * Use with {@link #getSystemService(String)} to retrieve an
5499      * {@link android.os.SystemConfigManager}.
5500      * @hide
5501      */
5502     @SystemApi
5503     public static final String SYSTEM_CONFIG_SERVICE = "system_config";
5504 
5505     /**
5506      * Use with {@link #getSystemService(String)} to retrieve an
5507      * {@link android.telephony.ims.RcsMessageManager}.
5508      * @hide
5509      */
5510     public static final String TELEPHONY_RCS_MESSAGE_SERVICE = "ircsmessage";
5511 
5512      /**
5513      * Use with {@link #getSystemService(String)} to retrieve an
5514      * {@link android.os.image.DynamicSystemManager}.
5515      * @hide
5516      */
5517     public static final String DYNAMIC_SYSTEM_SERVICE = "dynamic_system";
5518 
5519     /**
5520      * Use with {@link #getSystemService(String)} to retrieve a {@link
5521      * android.app.blob.BlobStoreManager} for contributing and accessing data blobs
5522      * from the blob store maintained by the system.
5523      *
5524      * @see #getSystemService(String)
5525      * @see android.app.blob.BlobStoreManager
5526      */
5527     public static final String BLOB_STORE_SERVICE = "blob_store";
5528 
5529     /**
5530      * Use with {@link #getSystemService(String)} to retrieve an
5531      * {@link TelephonyRegistryManager}.
5532      * @hide
5533      */
5534     public static final String TELEPHONY_REGISTRY_SERVICE = "telephony_registry";
5535 
5536     /**
5537      * Use with {@link #getSystemService(String)} to retrieve an
5538      * {@link android.os.BatteryStatsManager}.
5539      * @hide
5540      */
5541     @SystemApi
5542     @SuppressLint("ServiceName")
5543     public static final String BATTERY_STATS_SERVICE = "batterystats";
5544 
5545     /**
5546      * Use with {@link #getSystemService(String)} to retrieve an
5547      * {@link android.app.appsearch.AppSearchManager} for
5548      * indexing and querying app data managed by the system.
5549      *
5550      * @see #getSystemService(String)
5551      */
5552     public static final String APP_SEARCH_SERVICE = "app_search";
5553 
5554     /**
5555      * Use with {@link #getSystemService(String)} to retrieve an
5556      * {@link android.content.integrity.AppIntegrityManager}.
5557      * @hide
5558      */
5559     @SystemApi
5560     public static final String APP_INTEGRITY_SERVICE = "app_integrity";
5561 
5562     /**
5563      * Use with {@link #getSystemService(String)} to retrieve an
5564      * {@link android.content.pm.DataLoaderManager}.
5565      * @hide
5566      */
5567     public static final String DATA_LOADER_MANAGER_SERVICE = "dataloader_manager";
5568 
5569     /**
5570      * Use with {@link #getSystemService(String)} to retrieve an
5571      * {@link android.os.incremental.IncrementalManager}.
5572      * @hide
5573      */
5574     public static final String INCREMENTAL_SERVICE = "incremental";
5575 
5576     /**
5577      * Use with {@link #getSystemService(String)} to retrieve an
5578      * {@link android.security.FileIntegrityManager}.
5579      * @see #getSystemService(String)
5580      * @see android.security.FileIntegrityManager
5581      */
5582     public static final String FILE_INTEGRITY_SERVICE = "file_integrity";
5583 
5584     /**
5585      * Use with {@link #getSystemService(String)} to retrieve a
5586      * {@link android.hardware.lights.LightsManager} for controlling device lights.
5587      *
5588      * @see #getSystemService(String)
5589      * @hide
5590      */
5591     public static final String LIGHTS_SERVICE = "lights";
5592 
5593     /**
5594      * Use with {@link #getSystemService(String)} to retrieve a
5595      * {@link android.uwb.UwbManager}.
5596      *
5597      * @see #getSystemService(String)
5598      * @hide
5599      */
5600     public static final String UWB_SERVICE = "uwb";
5601 
5602     /**
5603      * Use with {@link #getSystemService(String)} to retrieve a
5604      * {@link android.app.DreamManager} for controlling Dream states.
5605      *
5606      * @see #getSystemService(String)
5607 
5608      * @hide
5609      */
5610     @TestApi
5611     public static final String DREAM_SERVICE = "dream";
5612 
5613     /**
5614      * Use with {@link #getSystemService(String)} to retrieve a
5615      * {@link android.telephony.SmsManager} for accessing Sms functionality.
5616      *
5617      * @see #getSystemService(String)
5618 
5619      * @hide
5620      */
5621     public static final String SMS_SERVICE = "sms";
5622 
5623     /**
5624      * Use with {@link #getSystemService(String)} to access a {@link PeopleManager} to interact
5625      * with your published conversations.
5626      *
5627      * @see #getSystemService(String)
5628      */
5629     public static final String PEOPLE_SERVICE = "people";
5630 
5631     /**
5632      * Use with {@link #getSystemService(String)} to access device state service.
5633      *
5634      * @see #getSystemService(String)
5635      * @hide
5636      */
5637     public static final String DEVICE_STATE_SERVICE = "device_state";
5638 
5639     /**
5640      * Use with {@link #getSystemService(String)} to retrieve a
5641      * {@link android.media.metrics.MediaMetricsManager} for interacting with media metrics
5642      * on the device.
5643      *
5644      * @see #getSystemService(String)
5645      * @see android.media.metrics.MediaMetricsManager
5646      */
5647     public static final String MEDIA_METRICS_SERVICE = "media_metrics";
5648 
5649     /**
5650      * Use with {@link #getSystemService(String)} to access system speech recognition service.
5651      *
5652      * @see #getSystemService(String)
5653      * @hide
5654     */
5655     public static final String SPEECH_RECOGNITION_SERVICE = "speech_recognition";
5656 
5657     /**
5658      * Use with {@link #getSystemService(String)} to retrieve a
5659      * {@link GameManager}.
5660      *
5661      * @see #getSystemService(String)
5662      */
5663     public static final String GAME_SERVICE = "game";
5664 
5665     /**
5666      * Use with {@link #getSystemService(String)} to access
5667      * {@link android.content.pm.verify.domain.DomainVerificationManager} to retrieve approval and
5668      * user state for declared web domains.
5669      *
5670      * @see #getSystemService(String)
5671      * @see android.content.pm.verify.domain.DomainVerificationManager
5672      */
5673     public static final String DOMAIN_VERIFICATION_SERVICE = "domain_verification";
5674 
5675     /**
5676      * Use with {@link #getSystemService(String)} to access
5677      * {@link android.view.displayhash.DisplayHashManager} to handle display hashes.
5678      *
5679      * @see #getSystemService(String)
5680      */
5681     public static final String DISPLAY_HASH_SERVICE = "display_hash";
5682 
5683     /**
5684      * Determine whether the given permission is allowed for a particular
5685      * process and user ID running in the system.
5686      *
5687      * @param permission The name of the permission being checked.
5688      * @param pid The process ID being checked against.  Must be > 0.
5689      * @param uid The user ID being checked against.  A uid of 0 is the root
5690      * user, which will pass every permission check.
5691      *
5692      * @return {@link PackageManager#PERMISSION_GRANTED} if the given
5693      * pid/uid is allowed that permission, or
5694      * {@link PackageManager#PERMISSION_DENIED} if it is not.
5695      *
5696      * @see PackageManager#checkPermission(String, String)
5697      * @see #checkCallingPermission
5698      */
5699     @CheckResult(suggest="#enforcePermission(String,int,int,String)")
5700     @PackageManager.PermissionResult
checkPermission(@onNull String permission, int pid, int uid)5701     public abstract int checkPermission(@NonNull String permission, int pid, int uid);
5702 
5703     /** @hide */
5704     @SuppressWarnings("HiddenAbstractMethod")
5705     @PackageManager.PermissionResult
5706     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
checkPermission(@onNull String permission, int pid, int uid, IBinder callerToken)5707     public abstract int checkPermission(@NonNull String permission, int pid, int uid,
5708             IBinder callerToken);
5709 
5710     /**
5711      * Determine whether the calling process of an IPC you are handling has been
5712      * granted a particular permission.  This is basically the same as calling
5713      * {@link #checkPermission(String, int, int)} with the pid and uid returned
5714      * by {@link android.os.Binder#getCallingPid} and
5715      * {@link android.os.Binder#getCallingUid}.  One important difference
5716      * is that if you are not currently processing an IPC, this function
5717      * will always fail.  This is done to protect against accidentally
5718      * leaking permissions; you can use {@link #checkCallingOrSelfPermission}
5719      * to avoid this protection.
5720      *
5721      * @param permission The name of the permission being checked.
5722      *
5723      * @return {@link PackageManager#PERMISSION_GRANTED} if the calling
5724      * pid/uid is allowed that permission, or
5725      * {@link PackageManager#PERMISSION_DENIED} if it is not.
5726      *
5727      * @see PackageManager#checkPermission(String, String)
5728      * @see #checkPermission
5729      * @see #checkCallingOrSelfPermission
5730      */
5731     @CheckResult(suggest="#enforceCallingPermission(String,String)")
5732     @PackageManager.PermissionResult
checkCallingPermission(@onNull String permission)5733     public abstract int checkCallingPermission(@NonNull String permission);
5734 
5735     /**
5736      * Determine whether the calling process of an IPC <em>or you</em> have been
5737      * granted a particular permission.  This is the same as
5738      * {@link #checkCallingPermission}, except it grants your own permissions
5739      * if you are not currently processing an IPC.  Use with care!
5740      *
5741      * @param permission The name of the permission being checked.
5742      *
5743      * @return {@link PackageManager#PERMISSION_GRANTED} if the calling
5744      * pid/uid is allowed that permission, or
5745      * {@link PackageManager#PERMISSION_DENIED} if it is not.
5746      *
5747      * @see PackageManager#checkPermission(String, String)
5748      * @see #checkPermission
5749      * @see #checkCallingPermission
5750      */
5751     @CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)")
5752     @PackageManager.PermissionResult
checkCallingOrSelfPermission(@onNull String permission)5753     public abstract int checkCallingOrSelfPermission(@NonNull String permission);
5754 
5755     /**
5756      * Determine whether <em>you</em> have been granted a particular permission.
5757      *
5758      * @param permission The name of the permission being checked.
5759      *
5760      * @return {@link PackageManager#PERMISSION_GRANTED} if you have the
5761      * permission, or {@link PackageManager#PERMISSION_DENIED} if not.
5762      *
5763      * @see PackageManager#checkPermission(String, String)
5764      * @see #checkCallingPermission(String)
5765      */
5766     @PackageManager.PermissionResult
checkSelfPermission(@onNull String permission)5767     public abstract int checkSelfPermission(@NonNull String permission);
5768 
5769     /**
5770      * If the given permission is not allowed for a particular process
5771      * and user ID running in the system, throw a {@link SecurityException}.
5772      *
5773      * @param permission The name of the permission being checked.
5774      * @param pid The process ID being checked against.  Must be &gt; 0.
5775      * @param uid The user ID being checked against.  A uid of 0 is the root
5776      * user, which will pass every permission check.
5777      * @param message A message to include in the exception if it is thrown.
5778      *
5779      * @see #checkPermission(String, int, int)
5780      */
enforcePermission( @onNull String permission, int pid, int uid, @Nullable String message)5781     public abstract void enforcePermission(
5782             @NonNull String permission, int pid, int uid, @Nullable String message);
5783 
5784     /**
5785      * If the calling process of an IPC you are handling has not been
5786      * granted a particular permission, throw a {@link
5787      * SecurityException}.  This is basically the same as calling
5788      * {@link #enforcePermission(String, int, int, String)} with the
5789      * pid and uid returned by {@link android.os.Binder#getCallingPid}
5790      * and {@link android.os.Binder#getCallingUid}.  One important
5791      * difference is that if you are not currently processing an IPC,
5792      * this function will always throw the SecurityException.  This is
5793      * done to protect against accidentally leaking permissions; you
5794      * can use {@link #enforceCallingOrSelfPermission} to avoid this
5795      * protection.
5796      *
5797      * @param permission The name of the permission being checked.
5798      * @param message A message to include in the exception if it is thrown.
5799      *
5800      * @see #checkCallingPermission(String)
5801      */
enforceCallingPermission( @onNull String permission, @Nullable String message)5802     public abstract void enforceCallingPermission(
5803             @NonNull String permission, @Nullable String message);
5804 
5805     /**
5806      * If neither you nor the calling process of an IPC you are
5807      * handling has been granted a particular permission, throw a
5808      * {@link SecurityException}.  This is the same as {@link
5809      * #enforceCallingPermission}, except it grants your own
5810      * permissions if you are not currently processing an IPC.  Use
5811      * with care!
5812      *
5813      * @param permission The name of the permission being checked.
5814      * @param message A message to include in the exception if it is thrown.
5815      *
5816      * @see #checkCallingOrSelfPermission(String)
5817      */
enforceCallingOrSelfPermission( @onNull String permission, @Nullable String message)5818     public abstract void enforceCallingOrSelfPermission(
5819             @NonNull String permission, @Nullable String message);
5820 
5821     /**
5822      * Grant permission to access a specific Uri to another package, regardless
5823      * of whether that package has general permission to access the Uri's
5824      * content provider.  This can be used to grant specific, temporary
5825      * permissions, typically in response to user interaction (such as the
5826      * user opening an attachment that you would like someone else to
5827      * display).
5828      *
5829      * <p>Normally you should use {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
5830      * Intent.FLAG_GRANT_READ_URI_PERMISSION} or
5831      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
5832      * Intent.FLAG_GRANT_WRITE_URI_PERMISSION} with the Intent being used to
5833      * start an activity instead of this function directly.  If you use this
5834      * function directly, you should be sure to call
5835      * {@link #revokeUriPermission} when the target should no longer be allowed
5836      * to access it.
5837      *
5838      * <p>To succeed, the content provider owning the Uri must have set the
5839      * {@link android.R.styleable#AndroidManifestProvider_grantUriPermissions
5840      * grantUriPermissions} attribute in its manifest or included the
5841      * {@link android.R.styleable#AndroidManifestGrantUriPermission
5842      * &lt;grant-uri-permissions&gt;} tag.
5843      *
5844      * @param toPackage The package you would like to allow to access the Uri.
5845      * @param uri The Uri you would like to grant access to.
5846      * @param modeFlags The desired access modes.
5847      *
5848      * @see #revokeUriPermission
5849      */
grantUriPermission(String toPackage, Uri uri, @Intent.GrantUriMode int modeFlags)5850     public abstract void grantUriPermission(String toPackage, Uri uri,
5851             @Intent.GrantUriMode int modeFlags);
5852 
5853     /**
5854      * Remove all permissions to access a particular content provider Uri
5855      * that were previously added with {@link #grantUriPermission} or <em>any other</em> mechanism.
5856      * The given Uri will match all previously granted Uris that are the same or a
5857      * sub-path of the given Uri.  That is, revoking "content://foo/target" will
5858      * revoke both "content://foo/target" and "content://foo/target/sub", but not
5859      * "content://foo".  It will not remove any prefix grants that exist at a
5860      * higher level.
5861      *
5862      * <p>Prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}, if you did not have
5863      * regular permission access to a Uri, but had received access to it through
5864      * a specific Uri permission grant, you could not revoke that grant with this
5865      * function and a {@link SecurityException} would be thrown.  As of
5866      * {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this function will not throw a security
5867      * exception, but will remove whatever permission grants to the Uri had been given to the app
5868      * (or none).</p>
5869      *
5870      * <p>Unlike {@link #revokeUriPermission(String, Uri, int)}, this method impacts all permission
5871      * grants matching the given Uri, for any package they had been granted to, through any
5872      * mechanism this had happened (such as indirectly through the clipboard, activity launch,
5873      * service start, etc).  That means this can be potentially dangerous to use, as it can
5874      * revoke grants that another app could be strongly expecting to stick around.</p>
5875      *
5876      * @param uri The Uri you would like to revoke access to.
5877      * @param modeFlags The access modes to revoke.
5878      *
5879      * @see #grantUriPermission
5880      */
revokeUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags)5881     public abstract void revokeUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags);
5882 
5883     /**
5884      * Remove permissions to access a particular content provider Uri
5885      * that were previously added with {@link #grantUriPermission} for a specific target
5886      * package.  The given Uri will match all previously granted Uris that are the same or a
5887      * sub-path of the given Uri.  That is, revoking "content://foo/target" will
5888      * revoke both "content://foo/target" and "content://foo/target/sub", but not
5889      * "content://foo".  It will not remove any prefix grants that exist at a
5890      * higher level.
5891      *
5892      * <p>Unlike {@link #revokeUriPermission(Uri, int)}, this method will <em>only</em>
5893      * revoke permissions that had been explicitly granted through {@link #grantUriPermission}
5894      * and only for the package specified.  Any matching grants that have happened through
5895      * other mechanisms (clipboard, activity launching, service starting, etc) will not be
5896      * removed.</p>
5897      *
5898      * @param toPackage The package you had previously granted access to.
5899      * @param uri The Uri you would like to revoke access to.
5900      * @param modeFlags The access modes to revoke.
5901      *
5902      * @see #grantUriPermission
5903      */
revokeUriPermission(String toPackage, Uri uri, @Intent.AccessUriMode int modeFlags)5904     public abstract void revokeUriPermission(String toPackage, Uri uri,
5905             @Intent.AccessUriMode int modeFlags);
5906 
5907     /**
5908      * Determine whether a particular process and user ID has been granted
5909      * permission to access a specific URI.  This only checks for permissions
5910      * that have been explicitly granted -- if the given process/uid has
5911      * more general access to the URI's content provider then this check will
5912      * always fail.
5913      *
5914      * @param uri The uri that is being checked.
5915      * @param pid The process ID being checked against.  Must be &gt; 0.
5916      * @param uid The user ID being checked against.  A uid of 0 is the root
5917      * user, which will pass every permission check.
5918      * @param modeFlags The access modes to check.
5919      *
5920      * @return {@link PackageManager#PERMISSION_GRANTED} if the given
5921      * pid/uid is allowed to access that uri, or
5922      * {@link PackageManager#PERMISSION_DENIED} if it is not.
5923      *
5924      * @see #checkCallingUriPermission
5925      */
5926     @CheckResult(suggest="#enforceUriPermission(Uri,int,int,String)")
5927     @PackageManager.PermissionResult
checkUriPermission(Uri uri, int pid, int uid, @Intent.AccessUriMode int modeFlags)5928     public abstract int checkUriPermission(Uri uri, int pid, int uid,
5929             @Intent.AccessUriMode int modeFlags);
5930 
5931     /**
5932      * Determine whether a particular process and user ID has been granted
5933      * permission to access a list of URIs.  This only checks for permissions
5934      * that have been explicitly granted -- if the given process/uid has
5935      * more general access to the URI's content provider then this check will
5936      * always fail.
5937      *
5938      * @param uris The list of URIs that is being checked.
5939      * @param pid The process ID being checked against.  Must be &gt; 0.
5940      * @param uid The user ID being checked against.  A uid of 0 is the root
5941      * user, which will pass every permission check.
5942      * @param modeFlags The access modes to check for the list of uris
5943      *
5944      * @return Array of permission grants corresponding to each entry in the list of uris.
5945      * {@link PackageManager#PERMISSION_GRANTED} if the given pid/uid is allowed to access that uri,
5946      * or {@link PackageManager#PERMISSION_DENIED} if it is not.
5947      *
5948      * @see #checkCallingUriPermission
5949      */
5950     @NonNull
5951     @PackageManager.PermissionResult
checkUriPermissions(@onNull List<Uri> uris, int pid, int uid, @Intent.AccessUriMode int modeFlags)5952     public int[] checkUriPermissions(@NonNull List<Uri> uris, int pid, int uid,
5953             @Intent.AccessUriMode int modeFlags) {
5954         throw new RuntimeException("Not implemented. Must override in a subclass.");
5955     }
5956 
5957     /** @hide */
5958     @SuppressWarnings("HiddenAbstractMethod")
5959     @PackageManager.PermissionResult
checkUriPermission(Uri uri, int pid, int uid, @Intent.AccessUriMode int modeFlags, IBinder callerToken)5960     public abstract int checkUriPermission(Uri uri, int pid, int uid,
5961             @Intent.AccessUriMode int modeFlags, IBinder callerToken);
5962 
5963     /**
5964      * Determine whether the calling process and user ID has been
5965      * granted permission to access a specific URI.  This is basically
5966      * the same as calling {@link #checkUriPermission(Uri, int, int,
5967      * int)} with the pid and uid returned by {@link
5968      * android.os.Binder#getCallingPid} and {@link
5969      * android.os.Binder#getCallingUid}.  One important difference is
5970      * that if you are not currently processing an IPC, this function
5971      * will always fail.
5972      *
5973      * @param uri The uri that is being checked.
5974      * @param modeFlags The access modes to check.
5975      *
5976      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
5977      * is allowed to access that uri, or
5978      * {@link PackageManager#PERMISSION_DENIED} if it is not.
5979      *
5980      * @see #checkUriPermission(Uri, int, int, int)
5981      */
5982     @CheckResult(suggest="#enforceCallingUriPermission(Uri,int,String)")
5983     @PackageManager.PermissionResult
checkCallingUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags)5984     public abstract int checkCallingUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags);
5985 
5986     /**
5987      * Determine whether the calling process and user ID has been
5988      * granted permission to access a list of URIs.  This is basically
5989      * the same as calling {@link #checkUriPermissions(List, int, int, int)}
5990      * with the pid and uid returned by {@link
5991      * android.os.Binder#getCallingPid} and {@link
5992      * android.os.Binder#getCallingUid}.  One important difference is
5993      * that if you are not currently processing an IPC, this function
5994      * will always fail.
5995      *
5996      * @param uris The list of URIs that is being checked.
5997      * @param modeFlags The access modes to check.
5998      *
5999      * @return Array of permission grants corresponding to each entry in the list of uris.
6000      * {@link PackageManager#PERMISSION_GRANTED} if the given pid/uid is allowed to access that uri,
6001      * or {@link PackageManager#PERMISSION_DENIED} if it is not.
6002      *
6003      * @see #checkUriPermission(Uri, int, int, int)
6004      */
6005     @NonNull
6006     @PackageManager.PermissionResult
checkCallingUriPermissions(@onNull List<Uri> uris, @Intent.AccessUriMode int modeFlags)6007     public int[] checkCallingUriPermissions(@NonNull List<Uri> uris,
6008             @Intent.AccessUriMode int modeFlags) {
6009         throw new RuntimeException("Not implemented. Must override in a subclass.");
6010     }
6011 
6012     /**
6013      * Determine whether the calling process of an IPC <em>or you</em> has been granted
6014      * permission to access a specific URI.  This is the same as
6015      * {@link #checkCallingUriPermission}, except it grants your own permissions
6016      * if you are not currently processing an IPC.  Use with care!
6017      *
6018      * @param uri The uri that is being checked.
6019      * @param modeFlags The access modes to check.
6020      *
6021      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
6022      * is allowed to access that uri, or
6023      * {@link PackageManager#PERMISSION_DENIED} if it is not.
6024      *
6025      * @see #checkCallingUriPermission
6026      */
6027     @CheckResult(suggest="#enforceCallingOrSelfUriPermission(Uri,int,String)")
6028     @PackageManager.PermissionResult
checkCallingOrSelfUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags)6029     public abstract int checkCallingOrSelfUriPermission(Uri uri,
6030             @Intent.AccessUriMode int modeFlags);
6031 
6032     /**
6033      * Determine whether the calling process of an IPC <em>or you</em> has been granted
6034      * permission to access a list of URIs.  This is the same as
6035      * {@link #checkCallingUriPermission}, except it grants your own permissions
6036      * if you are not currently processing an IPC.  Use with care!
6037      *
6038      * @param uris The list of URIs that is being checked.
6039      * @param modeFlags The access modes to check.
6040      *
6041      * @return Array of permission grants corresponding to each entry in the list of uris.
6042      * {@link PackageManager#PERMISSION_GRANTED} if the given pid/uid is allowed to access that uri,
6043      * or {@link PackageManager#PERMISSION_DENIED} if it is not.
6044      *
6045      * @see #checkCallingUriPermission
6046      */
6047     @NonNull
6048     @PackageManager.PermissionResult
checkCallingOrSelfUriPermissions(@onNull List<Uri> uris, @Intent.AccessUriMode int modeFlags)6049     public int[] checkCallingOrSelfUriPermissions(@NonNull List<Uri> uris,
6050             @Intent.AccessUriMode int modeFlags) {
6051         throw new RuntimeException("Not implemented. Must override in a subclass.");
6052     }
6053 
6054     /**
6055      * Check both a Uri and normal permission.  This allows you to perform
6056      * both {@link #checkPermission} and {@link #checkUriPermission} in one
6057      * call.
6058      *
6059      * @param uri The Uri whose permission is to be checked, or null to not
6060      * do this check.
6061      * @param readPermission The permission that provides overall read access,
6062      * or null to not do this check.
6063      * @param writePermission The permission that provides overall write
6064      * access, or null to not do this check.
6065      * @param pid The process ID being checked against.  Must be &gt; 0.
6066      * @param uid The user ID being checked against.  A uid of 0 is the root
6067      * user, which will pass every permission check.
6068      * @param modeFlags The access modes to check.
6069      *
6070      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
6071      * is allowed to access that uri or holds one of the given permissions, or
6072      * {@link PackageManager#PERMISSION_DENIED} if it is not.
6073      */
6074     @CheckResult(suggest="#enforceUriPermission(Uri,String,String,int,int,int,String)")
6075     @PackageManager.PermissionResult
checkUriPermission(@ullable Uri uri, @Nullable String readPermission, @Nullable String writePermission, int pid, int uid, @Intent.AccessUriMode int modeFlags)6076     public abstract int checkUriPermission(@Nullable Uri uri, @Nullable String readPermission,
6077             @Nullable String writePermission, int pid, int uid,
6078             @Intent.AccessUriMode int modeFlags);
6079 
6080     /**
6081      * If a particular process and user ID has not been granted
6082      * permission to access a specific URI, throw {@link
6083      * SecurityException}.  This only checks for permissions that have
6084      * been explicitly granted -- if the given process/uid has more
6085      * general access to the URI's content provider then this check
6086      * will always fail.
6087      *
6088      * @param uri The uri that is being checked.
6089      * @param pid The process ID being checked against.  Must be &gt; 0.
6090      * @param uid The user ID being checked against.  A uid of 0 is the root
6091      * user, which will pass every permission check.
6092      * @param modeFlags The access modes to enforce.
6093      * @param message A message to include in the exception if it is thrown.
6094      *
6095      * @see #checkUriPermission(Uri, int, int, int)
6096      */
enforceUriPermission( Uri uri, int pid, int uid, @Intent.AccessUriMode int modeFlags, String message)6097     public abstract void enforceUriPermission(
6098             Uri uri, int pid, int uid, @Intent.AccessUriMode int modeFlags, String message);
6099 
6100     /**
6101      * If the calling process and user ID has not been granted
6102      * permission to access a specific URI, throw {@link
6103      * SecurityException}.  This is basically the same as calling
6104      * {@link #enforceUriPermission(Uri, int, int, int, String)} with
6105      * the pid and uid returned by {@link
6106      * android.os.Binder#getCallingPid} and {@link
6107      * android.os.Binder#getCallingUid}.  One important difference is
6108      * that if you are not currently processing an IPC, this function
6109      * will always throw a SecurityException.
6110      *
6111      * @param uri The uri that is being checked.
6112      * @param modeFlags The access modes to enforce.
6113      * @param message A message to include in the exception if it is thrown.
6114      *
6115      * @see #checkCallingUriPermission(Uri, int)
6116      */
enforceCallingUriPermission( Uri uri, @Intent.AccessUriMode int modeFlags, String message)6117     public abstract void enforceCallingUriPermission(
6118             Uri uri, @Intent.AccessUriMode int modeFlags, String message);
6119 
6120     /**
6121      * If the calling process of an IPC <em>or you</em> has not been
6122      * granted permission to access a specific URI, throw {@link
6123      * SecurityException}.  This is the same as {@link
6124      * #enforceCallingUriPermission}, except it grants your own
6125      * permissions if you are not currently processing an IPC.  Use
6126      * with care!
6127      *
6128      * @param uri The uri that is being checked.
6129      * @param modeFlags The access modes to enforce.
6130      * @param message A message to include in the exception if it is thrown.
6131      *
6132      * @see #checkCallingOrSelfUriPermission(Uri, int)
6133      */
enforceCallingOrSelfUriPermission( Uri uri, @Intent.AccessUriMode int modeFlags, String message)6134     public abstract void enforceCallingOrSelfUriPermission(
6135             Uri uri, @Intent.AccessUriMode int modeFlags, String message);
6136 
6137     /**
6138      * Enforce both a Uri and normal permission.  This allows you to perform
6139      * both {@link #enforcePermission} and {@link #enforceUriPermission} in one
6140      * call.
6141      *
6142      * @param uri The Uri whose permission is to be checked, or null to not
6143      * do this check.
6144      * @param readPermission The permission that provides overall read access,
6145      * or null to not do this check.
6146      * @param writePermission The permission that provides overall write
6147      * access, or null to not do this check.
6148      * @param pid The process ID being checked against.  Must be &gt; 0.
6149      * @param uid The user ID being checked against.  A uid of 0 is the root
6150      * user, which will pass every permission check.
6151      * @param modeFlags The access modes to enforce.
6152      * @param message A message to include in the exception if it is thrown.
6153      *
6154      * @see #checkUriPermission(Uri, String, String, int, int, int)
6155      */
enforceUriPermission( @ullable Uri uri, @Nullable String readPermission, @Nullable String writePermission, int pid, int uid, @Intent.AccessUriMode int modeFlags, @Nullable String message)6156     public abstract void enforceUriPermission(
6157             @Nullable Uri uri, @Nullable String readPermission,
6158             @Nullable String writePermission, int pid, int uid, @Intent.AccessUriMode int modeFlags,
6159             @Nullable String message);
6160 
6161     /** @hide */
6162     @IntDef(flag = true, prefix = { "CONTEXT_" }, value = {
6163             CONTEXT_INCLUDE_CODE,
6164             CONTEXT_IGNORE_SECURITY,
6165             CONTEXT_RESTRICTED,
6166             CONTEXT_DEVICE_PROTECTED_STORAGE,
6167             CONTEXT_CREDENTIAL_PROTECTED_STORAGE,
6168             CONTEXT_REGISTER_PACKAGE,
6169     })
6170     @Retention(RetentionPolicy.SOURCE)
6171     public @interface CreatePackageOptions {}
6172 
6173     /**
6174      * Flag for use with {@link #createPackageContext}: include the application
6175      * code with the context.  This means loading code into the caller's
6176      * process, so that {@link #getClassLoader()} can be used to instantiate
6177      * the application's classes.  Setting this flags imposes security
6178      * restrictions on what application context you can access; if the
6179      * requested application can not be safely loaded into your process,
6180      * java.lang.SecurityException will be thrown.  If this flag is not set,
6181      * there will be no restrictions on the packages that can be loaded,
6182      * but {@link #getClassLoader} will always return the default system
6183      * class loader.
6184      */
6185     public static final int CONTEXT_INCLUDE_CODE = 0x00000001;
6186 
6187     /**
6188      * Flag for use with {@link #createPackageContext}: ignore any security
6189      * restrictions on the Context being requested, allowing it to always
6190      * be loaded.  For use with {@link #CONTEXT_INCLUDE_CODE} to allow code
6191      * to be loaded into a process even when it isn't safe to do so.  Use
6192      * with extreme care!
6193      */
6194     public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;
6195 
6196     /**
6197      * Flag for use with {@link #createPackageContext}: a restricted context may
6198      * disable specific features. For instance, a View associated with a restricted
6199      * context would ignore particular XML attributes.
6200      */
6201     public static final int CONTEXT_RESTRICTED = 0x00000004;
6202 
6203     /**
6204      * Flag for use with {@link #createPackageContext}: point all file APIs at
6205      * device-protected storage.
6206      *
6207      * @hide
6208      */
6209     public static final int CONTEXT_DEVICE_PROTECTED_STORAGE = 0x00000008;
6210 
6211     /**
6212      * Flag for use with {@link #createPackageContext}: point all file APIs at
6213      * credential-protected storage.
6214      *
6215      * @hide
6216      */
6217     public static final int CONTEXT_CREDENTIAL_PROTECTED_STORAGE = 0x00000010;
6218 
6219     /**
6220      * @hide Used to indicate we should tell the activity manager about the process
6221      * loading this code.
6222      */
6223     public static final int CONTEXT_REGISTER_PACKAGE = 0x40000000;
6224 
6225     /**
6226      * Return a new Context object for the given application name.  This
6227      * Context is the same as what the named application gets when it is
6228      * launched, containing the same resources and class loader.  Each call to
6229      * this method returns a new instance of a Context object; Context objects
6230      * are not shared, however they share common state (Resources, ClassLoader,
6231      * etc) so the Context instance itself is fairly lightweight.
6232      *
6233      * <p>Throws {@link android.content.pm.PackageManager.NameNotFoundException} if there is no
6234      * application with the given package name.
6235      *
6236      * <p>Throws {@link java.lang.SecurityException} if the Context requested
6237      * can not be loaded into the caller's process for security reasons (see
6238      * {@link #CONTEXT_INCLUDE_CODE} for more information}.
6239      *
6240      * @param packageName Name of the application's package.
6241      * @param flags Option flags.
6242      *
6243      * @return A {@link Context} for the application.
6244      *
6245      * @throws SecurityException &nbsp;
6246      * @throws PackageManager.NameNotFoundException if there is no application with
6247      * the given package name.
6248      */
createPackageContext(String packageName, @CreatePackageOptions int flags)6249     public abstract Context createPackageContext(String packageName,
6250             @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
6251 
6252     /**
6253      * Similar to {@link #createPackageContext(String, int)}, but with a
6254      * different {@link UserHandle}. For example, {@link #getContentResolver()}
6255      * will open any {@link Uri} as the given user.
6256      *
6257      * @hide
6258      */
6259     @SystemApi
6260     @NonNull
createPackageContextAsUser( @onNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user)6261     public Context createPackageContextAsUser(
6262             @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user)
6263             throws PackageManager.NameNotFoundException {
6264         if (Build.IS_ENG) {
6265             throw new IllegalStateException("createPackageContextAsUser not overridden!");
6266         }
6267         return this;
6268     }
6269 
6270     /**
6271      * Similar to {@link #createPackageContext(String, int)}, but for the own package with a
6272      * different {@link UserHandle}. For example, {@link #getContentResolver()}
6273      * will open any {@link Uri} as the given user.
6274      *
6275      * @hide
6276      */
6277     @SystemApi
6278     @NonNull
createContextAsUser(@onNull UserHandle user, @CreatePackageOptions int flags)6279     public Context createContextAsUser(@NonNull UserHandle user, @CreatePackageOptions int flags) {
6280         if (Build.IS_ENG) {
6281             throw new IllegalStateException("createContextAsUser not overridden!");
6282         }
6283         return this;
6284     }
6285 
6286     /**
6287      * Creates a context given an {@link android.content.pm.ApplicationInfo}.
6288      *
6289      * @hide
6290      */
6291     @SuppressWarnings("HiddenAbstractMethod")
6292     @UnsupportedAppUsage
createApplicationContext(ApplicationInfo application, @CreatePackageOptions int flags)6293     public abstract Context createApplicationContext(ApplicationInfo application,
6294             @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
6295 
6296     /**
6297      * Return a new Context object for the given split name. The new Context has a ClassLoader and
6298      * Resources object that can access the split's and all of its dependencies' code/resources.
6299      * Each call to this method returns a new instance of a Context object;
6300      * Context objects are not shared, however common state (ClassLoader, other Resources for
6301      * the same split) may be so the Context itself can be fairly lightweight.
6302      *
6303      * @param splitName The name of the split to include, as declared in the split's
6304      *                  <code>AndroidManifest.xml</code>.
6305      * @return A {@link Context} with the given split's code and/or resources loaded.
6306      */
createContextForSplit(String splitName)6307     public abstract Context createContextForSplit(String splitName)
6308             throws PackageManager.NameNotFoundException;
6309 
6310     /**
6311      * Get the user associated with this context.
6312      *
6313      * @return the user associated with this context
6314      *
6315      * @hide
6316      */
6317     @NonNull
6318     @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
6319     @TestApi
getUser()6320     public UserHandle getUser() {
6321         return android.os.Process.myUserHandle();
6322     }
6323 
6324     /**
6325      * Get the user associated with this context
6326      * @hide
6327      */
6328     @UnsupportedAppUsage
6329     @TestApi
getUserId()6330     public @UserIdInt int getUserId() {
6331         return android.os.UserHandle.myUserId();
6332     }
6333 
6334     /**
6335      * Return a new Context object for the current Context but whose resources
6336      * are adjusted to match the given Configuration.  Each call to this method
6337      * returns a new instance of a Context object; Context objects are not
6338      * shared, however common state (ClassLoader, other Resources for the
6339      * same configuration) may be so the Context itself can be fairly lightweight.
6340      *
6341      * @param overrideConfiguration A {@link Configuration} specifying what
6342      * values to modify in the base Configuration of the original Context's
6343      * resources.  If the base configuration changes (such as due to an
6344      * orientation change), the resources of this context will also change except
6345      * for those that have been explicitly overridden with a value here.
6346      *
6347      * @return A {@link Context} with the given configuration override.
6348      */
createConfigurationContext( @onNull Configuration overrideConfiguration)6349     public abstract Context createConfigurationContext(
6350             @NonNull Configuration overrideConfiguration);
6351 
6352     /**
6353      * Return a new Context object for the current Context but whose resources
6354      * are adjusted to match the metrics of the given Display.  Each call to this method
6355      * returns a new instance of a Context object; Context objects are not
6356      * shared, however common state (ClassLoader, other Resources for the
6357      * same configuration) may be so the Context itself can be fairly lightweight.
6358      *
6359      * To obtain an instance of a {@link WindowManager} (see {@link #getSystemService(String)}) that
6360      * is configured to show windows on the given display call
6361      * {@link #createWindowContext(int, Bundle)} on the returned display Context or use an
6362      * {@link android.app.Activity}.
6363      *
6364      * <p>
6365      * Note that invoking #createDisplayContext(Display) from an UI context is not regarded
6366      * as an UI context. In other words, it is not suggested to access UI components (such as
6367      * obtain a {@link WindowManager} by {@link #getSystemService(String)})
6368      * from the context created from #createDisplayContext(Display).
6369      * </p>
6370      *
6371      * @param display A {@link Display} object specifying the display for whose metrics the
6372      * Context's resources should be tailored.
6373      *
6374      * @return A {@link Context} for the display.
6375      *
6376      * @see #getSystemService(String)
6377      */
6378     @DisplayContext
createDisplayContext(@onNull Display display)6379     public abstract Context createDisplayContext(@NonNull Display display);
6380 
6381     /**
6382      * Creates a Context for a non-activity window.
6383      *
6384      * <p>
6385      * A window context is a context that can be used to add non-activity windows, such as
6386      * {@link android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY}. A window context
6387      * must be created from a context that has an associated {@link Display}, such as
6388      * {@link android.app.Activity Activity} or a context created with
6389      * {@link #createDisplayContext(Display)}.
6390      *
6391      * <p>
6392      * The window context is created with the appropriate {@link Configuration} for the area of the
6393      * display that the windows created with it can occupy; it must be used when
6394      * {@link android.view.LayoutInflater inflating} views, such that they can be inflated with
6395      * proper {@link Resources}.
6396      *
6397      * Below is a sample code to <b>add an application overlay window on the primary display:</b>
6398      * <pre class="prettyprint">
6399      * ...
6400      * final DisplayManager dm = anyContext.getSystemService(DisplayManager.class);
6401      * final Display primaryDisplay = dm.getDisplay(DEFAULT_DISPLAY);
6402      * final Context windowContext = anyContext.createDisplayContext(primaryDisplay)
6403      *         .createWindowContext(TYPE_APPLICATION_OVERLAY, null);
6404      * final View overlayView = Inflater.from(windowContext).inflate(someLayoutXml, null);
6405      *
6406      * // WindowManager.LayoutParams initialization
6407      * ...
6408      * // The types used in addView and createWindowContext must match.
6409      * mParams.type = TYPE_APPLICATION_OVERLAY;
6410      * ...
6411      *
6412      * windowContext.getSystemService(WindowManager.class).addView(overlayView, mParams);
6413      * </pre>
6414      *
6415      * <p>
6416      * This context's configuration and resources are adjusted to an area of the display where
6417      * the windows with provided type will be added. <b>Note that all windows associated with the
6418      * same context will have an affinity and can only be moved together between different displays
6419      * or areas on a display.</b> If there is a need to add different window types, or
6420      * non-associated windows, separate Contexts should be used.
6421      * </p>
6422      * <p>
6423      * Creating a window context is an expensive operation. Misuse of this API may lead to a huge
6424      * performance drop. The best practice is to use the same window context when possible.
6425      * An approach is to create one window context with specific window type and display and
6426      * use it everywhere it's needed.
6427      * </p>
6428      * <p>
6429      * After {@link Build.VERSION_CODES#S}, window context provides the capability to receive
6430      * configuration changes for existing token by overriding the
6431      * {@link android.view.WindowManager.LayoutParams#token token} of the
6432      * {@link android.view.WindowManager.LayoutParams} passed in
6433      * {@link WindowManager#addView(View, LayoutParams)}. This is useful when an application needs
6434      * to attach its window to an existing activity for window token sharing use-case.
6435      * </p>
6436      * <p>
6437      * Note that the window context in {@link Build.VERSION_CODES#R} didn't have this
6438      * capability. This is a no-op for the window context in {@link Build.VERSION_CODES#R}.
6439      * </p>
6440      * Below is sample code to <b>attach an existing token to a window context:</b>
6441      * <pre class="prettyprint">
6442      * final DisplayManager dm = anyContext.getSystemService(DisplayManager.class);
6443      * final Display primaryDisplay = dm.getDisplay(DEFAULT_DISPLAY);
6444      * final Context windowContext = anyContext.createWindowContext(primaryDisplay,
6445      *         TYPE_APPLICATION, null);
6446      *
6447      * // Get an existing token.
6448      * final IBinder existingToken = activity.getWindow().getAttributes().token;
6449      *
6450      * // The types used in addView() and createWindowContext() must match.
6451      * final WindowManager.LayoutParams params = new WindowManager.LayoutParams(TYPE_APPLICATION);
6452      * params.token = existingToken;
6453      *
6454      * // After WindowManager#addView(), the server side will extract the provided token from
6455      * // LayoutParams#token (existingToken in the sample code), and switch to propagate
6456      * // configuration changes from the node associated with the provided token.
6457      * windowContext.getSystemService(WindowManager.class).addView(overlayView, mParams);
6458      * </pre>
6459      * <p>
6460      * After {@link Build.VERSION_CODES#S}, window context provides the capability to listen to its
6461      * {@link Configuration} changes by calling
6462      * {@link #registerComponentCallbacks(ComponentCallbacks)}, while other kinds of {@link Context}
6463      * will register the {@link ComponentCallbacks} to {@link #getApplicationContext() its
6464      * Application context}. Note that window context only propagate
6465      * {@link ComponentCallbacks#onConfigurationChanged(Configuration)} callback.
6466      * {@link ComponentCallbacks#onLowMemory()} or other callbacks in {@link ComponentCallbacks2}
6467      * won't be invoked.
6468      * </p>
6469      * <p>
6470      * Note that using {@link android.app.Application} or {@link android.app.Service} context for
6471      * UI-related queries may result in layout or continuity issues on devices with variable screen
6472      * sizes (e.g. foldables) or in multi-window modes, since these non-UI contexts may not reflect
6473      * the {@link Configuration} changes for the visual container.
6474      * </p>
6475      * @param type Window type in {@link WindowManager.LayoutParams}
6476      * @param options A bundle used to pass window-related options
6477      * @return A {@link Context} that can be used to create
6478      *         non-{@link android.app.Activity activity} windows.
6479      *
6480      * @see #getSystemService(String)
6481      * @see #getSystemService(Class)
6482      * @see #WINDOW_SERVICE
6483      * @see #LAYOUT_INFLATER_SERVICE
6484      * @see #WALLPAPER_SERVICE
6485      * @throws UnsupportedOperationException if this {@link Context} does not attach to a display,
6486      * such as {@link android.app.Application Application} or {@link android.app.Service Service}.
6487      */
6488     @UiContext
6489     @NonNull
createWindowContext(@indowType int type, @Nullable Bundle options)6490     public Context createWindowContext(@WindowType int type, @Nullable Bundle options)  {
6491         throw new RuntimeException("Not implemented. Must override in a subclass.");
6492     }
6493 
6494     /**
6495      * Creates a {@code Context} for a non-{@link android.app.Activity activity} window on the given
6496      * {@link Display}.
6497      *
6498      * <p>
6499      * Similar to {@link #createWindowContext(int, Bundle)}, but the {@code display} is passed in,
6500      * instead of implicitly using the {@link #getDisplay() original Context's Display}.
6501      * </p>
6502      *
6503      * @param display The {@link Display} to associate with
6504      * @param type Window type in {@link WindowManager.LayoutParams}
6505      * @param options A bundle used to pass window-related options.
6506      * @return A {@link Context} that can be used to create
6507      *         non-{@link android.app.Activity activity} windows.
6508      * @throws IllegalArgumentException if the {@link Display} is {@code null}.
6509      *
6510      * @see #getSystemService(String)
6511      * @see #getSystemService(Class)
6512      * @see #WINDOW_SERVICE
6513      * @see #LAYOUT_INFLATER_SERVICE
6514      * @see #WALLPAPER_SERVICE
6515      */
6516     @UiContext
6517     @NonNull
createWindowContext(@onNull Display display, @WindowType int type, @SuppressLint("NullableCollection") @Nullable Bundle options)6518     public Context createWindowContext(@NonNull Display display, @WindowType int type,
6519             @SuppressLint("NullableCollection")
6520             @Nullable Bundle options) {
6521         throw new RuntimeException("Not implemented. Must override in a subclass.");
6522     }
6523 
6524     /**
6525      * Creates a context with specific properties and behaviors.
6526      *
6527      * @param contextParams Parameters for how the new context should behave.
6528      * @return A context with the specified behaviors.
6529      *
6530      * @see ContextParams
6531      */
6532     @NonNull
createContext(@onNull ContextParams contextParams)6533     public Context createContext(@NonNull ContextParams contextParams) {
6534         throw new RuntimeException("Not implemented. Must override in a subclass.");
6535     }
6536 
6537     /**
6538      * Return a new Context object for the current Context but attribute to a different tag.
6539      * In complex apps attribution tagging can be used to distinguish between separate logical
6540      * parts.
6541      *
6542      * @param attributionTag The tag or {@code null} to create a context for the default.
6543      *
6544      * @return A {@link Context} that is tagged for the new attribution
6545      *
6546      * @see #getAttributionTag()
6547      */
createAttributionContext(@ullable String attributionTag)6548     public @NonNull Context createAttributionContext(@Nullable String attributionTag) {
6549         throw new RuntimeException("Not implemented. Must override in a subclass.");
6550     }
6551 
6552     // TODO moltmann: remove
6553     /**
6554      * @removed
6555      */
6556     @Deprecated
createFeatureContext(@ullable String attributionTag)6557     public @NonNull Context createFeatureContext(@Nullable String attributionTag) {
6558         return createContext(new ContextParams.Builder(getParams())
6559                 .setAttributionTag(attributionTag)
6560                 .build());
6561     }
6562 
6563     /**
6564      * Return a new Context object for the current Context but whose storage
6565      * APIs are backed by device-protected storage.
6566      * <p>
6567      * On devices with direct boot, data stored in this location is encrypted
6568      * with a key tied to the physical device, and it can be accessed
6569      * immediately after the device has booted successfully, both
6570      * <em>before and after</em> the user has authenticated with their
6571      * credentials (such as a lock pattern or PIN).
6572      * <p>
6573      * Because device-protected data is available without user authentication,
6574      * you should carefully limit the data you store using this Context. For
6575      * example, storing sensitive authentication tokens or passwords in the
6576      * device-protected area is strongly discouraged.
6577      * <p>
6578      * If the underlying device does not have the ability to store
6579      * device-protected and credential-protected data using different keys, then
6580      * both storage areas will become available at the same time. They remain as
6581      * two distinct storage locations on disk, and only the window of
6582      * availability changes.
6583      * <p>
6584      * Each call to this method returns a new instance of a Context object;
6585      * Context objects are not shared, however common state (ClassLoader, other
6586      * Resources for the same configuration) may be so the Context itself can be
6587      * fairly lightweight.
6588      *
6589      * @see #isDeviceProtectedStorage()
6590      */
createDeviceProtectedStorageContext()6591     public abstract Context createDeviceProtectedStorageContext();
6592 
6593     /**
6594      * Return a new Context object for the current Context but whose storage
6595      * APIs are backed by credential-protected storage. This is the default
6596      * storage area for apps unless
6597      * {@link android.R.attr#defaultToDeviceProtectedStorage} was requested.
6598      * <p>
6599      * On devices with direct boot, data stored in this location is encrypted
6600      * with a key tied to user credentials, which can be accessed
6601      * <em>only after</em> the user has entered their credentials (such as a
6602      * lock pattern or PIN).
6603      * <p>
6604      * If the underlying device does not have the ability to store
6605      * device-protected and credential-protected data using different keys, then
6606      * both storage areas will become available at the same time. They remain as
6607      * two distinct storage locations on disk, and only the window of
6608      * availability changes.
6609      * <p>
6610      * Each call to this method returns a new instance of a Context object;
6611      * Context objects are not shared, however common state (ClassLoader, other
6612      * Resources for the same configuration) may be so the Context itself can be
6613      * fairly lightweight.
6614      *
6615      * @see #isCredentialProtectedStorage()
6616      * @hide
6617      */
6618     @SuppressWarnings("HiddenAbstractMethod")
6619     @SystemApi
createCredentialProtectedStorageContext()6620     public abstract Context createCredentialProtectedStorageContext();
6621 
6622     /**
6623      * Creates a UI context with a {@code token}. The users of this API should handle this context's
6624      * configuration changes.
6625      *
6626      * @param token The token to associate with the {@link Resources}
6627      * @param display The display to associate with the token context
6628      *
6629      * @hide
6630      */
6631     @UiContext
6632     @NonNull
createTokenContext(@onNull IBinder token, @NonNull Display display)6633     public Context createTokenContext(@NonNull IBinder token, @NonNull Display display) {
6634         throw new RuntimeException("Not implemented. Must override in a subclass.");
6635     }
6636 
6637     /**
6638      * Gets the display adjustments holder for this context.  This information
6639      * is provided on a per-application or activity basis and is used to simulate lower density
6640      * display metrics for legacy applications and restricted screen sizes.
6641      *
6642      * @param displayId The display id for which to get compatibility info.
6643      * @return The compatibility info holder, or null if not required by the application.
6644      * @hide
6645      */
6646     @SuppressWarnings("HiddenAbstractMethod")
getDisplayAdjustments(int displayId)6647     public abstract DisplayAdjustments getDisplayAdjustments(int displayId);
6648 
6649     /**
6650      * Get the display this context is associated with. Applications should use this method with
6651      * {@link android.app.Activity} or a context associated with a {@link Display} via
6652      * {@link #createDisplayContext(Display)} to get a display object associated with a Context, or
6653      * {@link android.hardware.display.DisplayManager#getDisplay} to get a display object by id.
6654      * @return Returns the {@link Display} object this context is associated with.
6655      * @throws UnsupportedOperationException if the method is called on an instance that is not
6656      *         associated with any display.
6657      */
6658     @Nullable
getDisplay()6659     public Display getDisplay() {
6660         throw new RuntimeException("Not implemented. Must override in a subclass.");
6661     }
6662 
6663     /**
6664      * A version of {@link #getDisplay()} that does not perform a Context misuse check to be used by
6665      * legacy APIs.
6666      * TODO(b/149790106): Fix usages and remove.
6667      * @hide
6668      */
6669     @Nullable
getDisplayNoVerify()6670     public Display getDisplayNoVerify() {
6671         throw new RuntimeException("Not implemented. Must override in a subclass.");
6672     }
6673 
6674     /**
6675      * Gets the ID of the display this context is associated with.
6676      *
6677      * @return display ID associated with this {@link Context}.
6678      * @see #getDisplay()
6679      * @hide
6680      */
6681     @SuppressWarnings("HiddenAbstractMethod")
6682     @TestApi
getDisplayId()6683     public abstract int getDisplayId();
6684 
6685     /**
6686      * @hide
6687      */
6688     @SuppressWarnings("HiddenAbstractMethod")
updateDisplay(int displayId)6689     public abstract void updateDisplay(int displayId);
6690 
6691     /**
6692      * Indicates whether this Context is restricted.
6693      *
6694      * @return {@code true} if this Context is restricted, {@code false} otherwise.
6695      *
6696      * @see #CONTEXT_RESTRICTED
6697      */
isRestricted()6698     public boolean isRestricted() {
6699         return false;
6700     }
6701 
6702     /**
6703      * Indicates if the storage APIs of this Context are backed by
6704      * device-protected storage.
6705      *
6706      * @see #createDeviceProtectedStorageContext()
6707      */
isDeviceProtectedStorage()6708     public abstract boolean isDeviceProtectedStorage();
6709 
6710     /**
6711      * Indicates if the storage APIs of this Context are backed by
6712      * credential-protected storage.
6713      *
6714      * @see #createCredentialProtectedStorageContext()
6715      * @hide
6716      */
6717     @SuppressWarnings("HiddenAbstractMethod")
6718     @SystemApi
isCredentialProtectedStorage()6719     public abstract boolean isCredentialProtectedStorage();
6720 
6721     /**
6722      * Returns true if the context can load unsafe resources, e.g. fonts.
6723      * @hide
6724      */
6725     @SuppressWarnings("HiddenAbstractMethod")
canLoadUnsafeResources()6726     public abstract boolean canLoadUnsafeResources();
6727 
6728     /**
6729      * Returns token if the {@link Context} is a {@link android.app.Activity}. Returns
6730      * {@code null} otherwise.
6731      *
6732      * @hide
6733      */
6734     @Nullable
getActivityToken()6735     public IBinder getActivityToken() {
6736         throw new RuntimeException("Not implemented. Must override in a subclass.");
6737     }
6738 
6739     /**
6740      * Returns token if the {@link Context} is a {@link android.app.WindowContext}. Returns
6741      * {@code null} otherwise.
6742      *
6743      * @hide
6744      */
6745     @Nullable
getWindowContextToken()6746     public IBinder getWindowContextToken() {
6747         throw new RuntimeException("Not implemented. Must override in a subclass.");
6748     }
6749 
6750     /**
6751      * Returns the proper token of a {@link Context}.
6752      *
6753      * If the {@link Context} is an {@link android.app.Activity}, returns
6754      * {@link #getActivityToken()}. If the {@lijnk Context} is a {@link android.app.WindowContext},
6755      * returns {@link #getWindowContextToken()}. Returns {@code null}, otherwise.
6756      *
6757      * @hide
6758      */
6759     @Nullable
getToken(@onNull Context context)6760     public static IBinder getToken(@NonNull Context context) {
6761         return context.getActivityToken() != null ? context.getActivityToken()
6762                 : context.getWindowContextToken();
6763     }
6764 
6765     /**
6766      * @hide
6767      */
6768     @Nullable
getServiceDispatcher(ServiceConnection conn, Handler handler, int flags)6769     public IServiceConnection getServiceDispatcher(ServiceConnection conn, Handler handler,
6770             int flags) {
6771         throw new RuntimeException("Not implemented. Must override in a subclass.");
6772     }
6773 
6774     /**
6775      * @hide
6776      */
getIApplicationThread()6777     public IApplicationThread getIApplicationThread() {
6778         throw new RuntimeException("Not implemented. Must override in a subclass.");
6779     }
6780 
6781     /**
6782      * @hide
6783      */
getMainThreadHandler()6784     public Handler getMainThreadHandler() {
6785         throw new RuntimeException("Not implemented. Must override in a subclass.");
6786     }
6787 
6788     /**
6789      * @hide
6790      */
getAutofillClient()6791     public AutofillClient getAutofillClient() {
6792         return null;
6793     }
6794 
6795     /**
6796      * @hide
6797      */
setAutofillClient(@uppressWarnings"unused") AutofillClient client)6798     public void setAutofillClient(@SuppressWarnings("unused") AutofillClient client) {
6799     }
6800 
6801     /**
6802      * @hide
6803      */
6804     @Nullable
getContentCaptureClient()6805     public ContentCaptureClient getContentCaptureClient() {
6806         return null;
6807     }
6808 
6809     /**
6810      * @hide
6811      */
isAutofillCompatibilityEnabled()6812     public final boolean isAutofillCompatibilityEnabled() {
6813         final AutofillOptions options = getAutofillOptions();
6814         return options != null && options.compatModeEnabled;
6815     }
6816 
6817     /**
6818      * @hide
6819      */
6820     @Nullable
getAutofillOptions()6821     public AutofillOptions getAutofillOptions() {
6822         return null;
6823     }
6824 
6825     /**
6826      * @hide
6827      */
6828     @TestApi
setAutofillOptions(@uppressWarnings"unused") @ullable AutofillOptions options)6829     public void setAutofillOptions(@SuppressWarnings("unused") @Nullable AutofillOptions options) {
6830     }
6831 
6832     /**
6833      * Gets the Content Capture options for this context, or {@code null} if it's not allowlisted.
6834      *
6835      * @hide
6836      */
6837     @Nullable
getContentCaptureOptions()6838     public ContentCaptureOptions getContentCaptureOptions() {
6839         return null;
6840     }
6841 
6842     /**
6843      * @hide
6844      */
6845     @TestApi
setContentCaptureOptions( @uppressWarnings"unused") @ullable ContentCaptureOptions options)6846     public void setContentCaptureOptions(
6847             @SuppressWarnings("unused") @Nullable ContentCaptureOptions options) {
6848     }
6849 
6850     /**
6851      * Throws an exception if the Context is using system resources,
6852      * which are non-runtime-overlay-themable and may show inconsistent UI.
6853      * @hide
6854      */
assertRuntimeOverlayThemable()6855     public void assertRuntimeOverlayThemable() {
6856         // Resources.getSystem() is a singleton and the only Resources not managed by
6857         // ResourcesManager; therefore Resources.getSystem() is not themable.
6858         if (getResources() == Resources.getSystem()) {
6859             throw new IllegalArgumentException("Non-UI context used to display UI; "
6860                     + "get a UI context from ActivityThread#getSystemUiContext()");
6861         }
6862     }
6863 
6864     /**
6865      * Returns {@code true} if the context is a UI context which can access UI components such as
6866      * {@link WindowManager}, {@link android.view.LayoutInflater LayoutInflater} or
6867      * {@link android.app.WallpaperManager WallpaperManager}. Accessing UI components from non-UI
6868      * contexts throws {@link android.os.strictmode.Violation} if
6869      * {@link android.os.StrictMode.VmPolicy.Builder#detectIncorrectContextUse()} is enabled.
6870      * <p>
6871      * Examples of UI contexts are
6872      * an {@link android.app.Activity Activity}, a context created from
6873      * {@link #createWindowContext(int, Bundle)} or
6874      * {@link android.inputmethodservice.InputMethodService InputMethodService}
6875      * </p>
6876      * <p>
6877      * Note that even if it is allowed programmatically, it is not suggested to override this
6878      * method to bypass {@link android.os.strictmode.IncorrectContextUseViolation} verification.
6879      * </p>
6880      *
6881      * @see #getDisplay()
6882      * @see #getSystemService(String)
6883      * @see android.os.StrictMode.VmPolicy.Builder#detectIncorrectContextUse()
6884      */
isUiContext()6885     public boolean isUiContext() {
6886         throw new RuntimeException("Not implemented. Must override in a subclass.");
6887     }
6888 
6889     /**
6890      * Called when a {@link Context} is going to be released.
6891      * This method can be overridden to perform the final cleanups, such as release
6892      * {@link BroadcastReceiver} registrations.
6893      *
6894      * @see WindowContext#destroy()
6895      *
6896      * @hide
6897      */
destroy()6898     public void destroy() { }
6899 
6900     /**
6901      * Indicates this {@link Context} has the proper {@link Configuration} to obtain
6902      * {@link android.view.LayoutInflater}, {@link android.view.ViewConfiguration} and
6903      * {@link android.view.GestureDetector}. Generally, all UI contexts, such as
6904      * {@link android.app.Activity} or {@link android.app.WindowContext}, are initialized with base
6905      * configuration.
6906      * <p>
6907      * Note that the context created via {@link Context#createConfigurationContext(Configuration)}
6908      * is also regarded as a context that is based on a configuration because the
6909      * configuration is explicitly provided via the API.
6910      * </p>
6911      *
6912      * @see #isUiContext()
6913      * @see #createConfigurationContext(Configuration)
6914      *
6915      * @hide
6916      */
isConfigurationContext()6917     public boolean isConfigurationContext() {
6918         throw new RuntimeException("Not implemented. Must override in a subclass.");
6919     }
6920 }
6921