Home | History | Annotate | Download | only in content
      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.CheckResult;
     21 import android.annotation.ColorInt;
     22 import android.annotation.ColorRes;
     23 import android.annotation.DrawableRes;
     24 import android.annotation.IntDef;
     25 import android.annotation.NonNull;
     26 import android.annotation.Nullable;
     27 import android.annotation.RequiresPermission;
     28 import android.annotation.StringDef;
     29 import android.annotation.StringRes;
     30 import android.annotation.StyleRes;
     31 import android.annotation.StyleableRes;
     32 import android.annotation.SystemApi;
     33 import android.annotation.TestApi;
     34 import android.annotation.UserIdInt;
     35 import android.content.pm.ApplicationInfo;
     36 import android.content.pm.PackageManager;
     37 import android.content.res.AssetManager;
     38 import android.content.res.ColorStateList;
     39 import android.content.res.Configuration;
     40 import android.content.res.Resources;
     41 import android.content.res.TypedArray;
     42 import android.database.DatabaseErrorHandler;
     43 import android.database.sqlite.SQLiteDatabase;
     44 import android.database.sqlite.SQLiteDatabase.CursorFactory;
     45 import android.graphics.Bitmap;
     46 import android.graphics.drawable.Drawable;
     47 import android.net.Uri;
     48 import android.os.Bundle;
     49 import android.os.Environment;
     50 import android.os.Handler;
     51 import android.os.IBinder;
     52 import android.os.Looper;
     53 import android.os.StatFs;
     54 import android.os.UserHandle;
     55 import android.os.UserManager;
     56 import android.provider.MediaStore;
     57 import android.util.AttributeSet;
     58 import android.view.Display;
     59 import android.view.DisplayAdjustments;
     60 import android.view.ViewDebug;
     61 import android.view.WindowManager;
     62 
     63 import java.io.File;
     64 import java.io.FileInputStream;
     65 import java.io.FileNotFoundException;
     66 import java.io.FileOutputStream;
     67 import java.io.IOException;
     68 import java.io.InputStream;
     69 import java.lang.annotation.Retention;
     70 import java.lang.annotation.RetentionPolicy;
     71 
     72 /**
     73  * Interface to global information about an application environment.  This is
     74  * an abstract class whose implementation is provided by
     75  * the Android system.  It
     76  * allows access to application-specific resources and classes, as well as
     77  * up-calls for application-level operations such as launching activities,
     78  * broadcasting and receiving intents, etc.
     79  */
     80 public abstract class Context {
     81     /**
     82      * File creation mode: the default mode, where the created file can only
     83      * be accessed by the calling application (or all applications sharing the
     84      * same user ID).
     85      */
     86     public static final int MODE_PRIVATE = 0x0000;
     87 
     88     /**
     89      * File creation mode: allow all other applications to have read access to
     90      * the created file.
     91      * <p>
     92      * As of {@link android.os.Build.VERSION_CODES#N} attempting to use this
     93      * mode will throw a {@link SecurityException}.
     94      *
     95      * @deprecated Creating world-readable files is very dangerous, and likely
     96      *             to cause security holes in applications. It is strongly
     97      *             discouraged; instead, applications should use more formal
     98      *             mechanism for interactions such as {@link ContentProvider},
     99      *             {@link BroadcastReceiver}, and {@link android.app.Service}.
    100      *             There are no guarantees that this access mode will remain on
    101      *             a file, such as when it goes through a backup and restore.
    102      * @see android.support.v4.content.FileProvider
    103      * @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
    104      */
    105     @Deprecated
    106     public static final int MODE_WORLD_READABLE = 0x0001;
    107 
    108     /**
    109      * File creation mode: allow all other applications to have write access to
    110      * the created file.
    111      * <p>
    112      * As of {@link android.os.Build.VERSION_CODES#N} attempting to use this
    113      * mode will throw a {@link SecurityException}.
    114      *
    115      * @deprecated Creating world-writable files is very dangerous, and likely
    116      *             to cause security holes in applications. It is strongly
    117      *             discouraged; instead, applications should use more formal
    118      *             mechanism for interactions such as {@link ContentProvider},
    119      *             {@link BroadcastReceiver}, and {@link android.app.Service}.
    120      *             There are no guarantees that this access mode will remain on
    121      *             a file, such as when it goes through a backup and restore.
    122      * @see android.support.v4.content.FileProvider
    123      * @see Intent#FLAG_GRANT_WRITE_URI_PERMISSION
    124      */
    125     @Deprecated
    126     public static final int MODE_WORLD_WRITEABLE = 0x0002;
    127 
    128     /**
    129      * File creation mode: for use with {@link #openFileOutput}, if the file
    130      * already exists then write data to the end of the existing file
    131      * instead of erasing it.
    132      * @see #openFileOutput
    133      */
    134     public static final int MODE_APPEND = 0x8000;
    135 
    136     /**
    137      * SharedPreference loading flag: when set, the file on disk will
    138      * be checked for modification even if the shared preferences
    139      * instance is already loaded in this process.  This behavior is
    140      * sometimes desired in cases where the application has multiple
    141      * processes, all writing to the same SharedPreferences file.
    142      * Generally there are better forms of communication between
    143      * processes, though.
    144      *
    145      * <p>This was the legacy (but undocumented) behavior in and
    146      * before Gingerbread (Android 2.3) and this flag is implied when
    147      * targetting such releases.  For applications targetting SDK
    148      * versions <em>greater than</em> Android 2.3, this flag must be
    149      * explicitly set if desired.
    150      *
    151      * @see #getSharedPreferences
    152      *
    153      * @deprecated MODE_MULTI_PROCESS does not work reliably in
    154      * some versions of Android, and furthermore does not provide any
    155      * mechanism for reconciling concurrent modifications across
    156      * processes.  Applications should not attempt to use it.  Instead,
    157      * they should use an explicit cross-process data management
    158      * approach such as {@link android.content.ContentProvider ContentProvider}.
    159      */
    160     @Deprecated
    161     public static final int MODE_MULTI_PROCESS = 0x0004;
    162 
    163     /**
    164      * Database open flag: when set, the database is opened with write-ahead
    165      * logging enabled by default.
    166      *
    167      * @see #openOrCreateDatabase(String, int, CursorFactory)
    168      * @see #openOrCreateDatabase(String, int, CursorFactory, DatabaseErrorHandler)
    169      * @see SQLiteDatabase#enableWriteAheadLogging
    170      */
    171     public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 0x0008;
    172 
    173     /**
    174      * Database open flag: when set, the database is opened without support for
    175      * localized collators.
    176      *
    177      * @see #openOrCreateDatabase(String, int, CursorFactory)
    178      * @see #openOrCreateDatabase(String, int, CursorFactory, DatabaseErrorHandler)
    179      * @see SQLiteDatabase#NO_LOCALIZED_COLLATORS
    180      */
    181     public static final int MODE_NO_LOCALIZED_COLLATORS = 0x0010;
    182 
    183     /** @hide */
    184     @IntDef(flag = true,
    185             value = {
    186                 BIND_AUTO_CREATE,
    187                 BIND_DEBUG_UNBIND,
    188                 BIND_NOT_FOREGROUND,
    189                 BIND_ABOVE_CLIENT,
    190                 BIND_ALLOW_OOM_MANAGEMENT,
    191                 BIND_WAIVE_PRIORITY,
    192                 BIND_IMPORTANT,
    193                 BIND_ADJUST_WITH_ACTIVITY
    194             })
    195     @Retention(RetentionPolicy.SOURCE)
    196     public @interface BindServiceFlags {}
    197 
    198     /**
    199      * Flag for {@link #bindService}: automatically create the service as long
    200      * as the binding exists.  Note that while this will create the service,
    201      * its {@link android.app.Service#onStartCommand}
    202      * method will still only be called due to an
    203      * explicit call to {@link #startService}.  Even without that, though,
    204      * this still provides you with access to the service object while the
    205      * service is created.
    206      *
    207      * <p>Note that prior to {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH},
    208      * not supplying this flag would also impact how important the system
    209      * consider's the target service's process to be.  When set, the only way
    210      * for it to be raised was by binding from a service in which case it will
    211      * only be important when that activity is in the foreground.  Now to
    212      * achieve this behavior you must explicitly supply the new flag
    213      * {@link #BIND_ADJUST_WITH_ACTIVITY}.  For compatibility, old applications
    214      * that don't specify {@link #BIND_AUTO_CREATE} will automatically have
    215      * the flags {@link #BIND_WAIVE_PRIORITY} and
    216      * {@link #BIND_ADJUST_WITH_ACTIVITY} set for them in order to achieve
    217      * the same result.
    218      */
    219     public static final int BIND_AUTO_CREATE = 0x0001;
    220 
    221     /**
    222      * Flag for {@link #bindService}: include debugging help for mismatched
    223      * calls to unbind.  When this flag is set, the callstack of the following
    224      * {@link #unbindService} call is retained, to be printed if a later
    225      * incorrect unbind call is made.  Note that doing this requires retaining
    226      * information about the binding that was made for the lifetime of the app,
    227      * resulting in a leak -- this should only be used for debugging.
    228      */
    229     public static final int BIND_DEBUG_UNBIND = 0x0002;
    230 
    231     /**
    232      * Flag for {@link #bindService}: don't allow this binding to raise
    233      * the target service's process to the foreground scheduling priority.
    234      * It will still be raised to at least the same memory priority
    235      * as the client (so that its process will not be killable in any
    236      * situation where the client is not killable), but for CPU scheduling
    237      * purposes it may be left in the background.  This only has an impact
    238      * in the situation where the binding client is a foreground process
    239      * and the target service is in a background process.
    240      */
    241     public static final int BIND_NOT_FOREGROUND = 0x0004;
    242 
    243     /**
    244      * Flag for {@link #bindService}: indicates that the client application
    245      * binding to this service considers the service to be more important than
    246      * the app itself.  When set, the platform will try to have the out of
    247      * memory killer kill the app before it kills the service it is bound to, though
    248      * this is not guaranteed to be the case.
    249      */
    250     public static final int BIND_ABOVE_CLIENT = 0x0008;
    251 
    252     /**
    253      * Flag for {@link #bindService}: allow the process hosting the bound
    254      * service to go through its normal memory management.  It will be
    255      * treated more like a running service, allowing the system to
    256      * (temporarily) expunge the process if low on memory or for some other
    257      * whim it may have, and being more aggressive about making it a candidate
    258      * to be killed (and restarted) if running for a long time.
    259      */
    260     public static final int BIND_ALLOW_OOM_MANAGEMENT = 0x0010;
    261 
    262     /**
    263      * Flag for {@link #bindService}: don't impact the scheduling or
    264      * memory management priority of the target service's hosting process.
    265      * Allows the service's process to be managed on the background LRU list
    266      * just like a regular application process in the background.
    267      */
    268     public static final int BIND_WAIVE_PRIORITY = 0x0020;
    269 
    270     /**
    271      * Flag for {@link #bindService}: this service is very important to
    272      * the client, so should be brought to the foreground process level
    273      * when the client is.  Normally a process can only be raised to the
    274      * visibility level by a client, even if that client is in the foreground.
    275      */
    276     public static final int BIND_IMPORTANT = 0x0040;
    277 
    278     /**
    279      * Flag for {@link #bindService}: If binding from an activity, allow the
    280      * target service's process importance to be raised based on whether the
    281      * activity is visible to the user, regardless whether another flag is
    282      * used to reduce the amount that the client process's overall importance
    283      * is used to impact it.
    284      */
    285     public static final int BIND_ADJUST_WITH_ACTIVITY = 0x0080;
    286 
    287     /**
    288      * @hide Flag for {@link #bindService}: allows application hosting service to manage whitelists
    289      * such as temporary allowing a {@code PendingIntent} to bypass Power Save mode.
    290      */
    291     public static final int BIND_ALLOW_WHITELIST_MANAGEMENT = 0x01000000;
    292 
    293     /**
    294      * @hide Flag for {@link #bindService}: Like {@link #BIND_FOREGROUND_SERVICE},
    295      * but only applies while the device is awake.
    296      */
    297     public static final int BIND_FOREGROUND_SERVICE_WHILE_AWAKE = 0x02000000;
    298 
    299     /**
    300      * @hide Flag for {@link #bindService}: For only the case where the binding
    301      * is coming from the system, set the process state to FOREGROUND_SERVICE
    302      * instead of the normal maximum of IMPORTANT_FOREGROUND.  That is, this is
    303      * saying that the process shouldn't participate in the normal power reduction
    304      * modes (removing network access etc).
    305      */
    306     public static final int BIND_FOREGROUND_SERVICE = 0x04000000;
    307 
    308     /**
    309      * @hide Flag for {@link #bindService}: Treat the binding as hosting
    310      * an activity, an unbinding as the activity going in the background.
    311      * That is, when unbinding, the process when empty will go on the activity
    312      * LRU list instead of the regular one, keeping it around more aggressively
    313      * than it otherwise would be.  This is intended for use with IMEs to try
    314      * to keep IME processes around for faster keyboard switching.
    315      */
    316     public static final int BIND_TREAT_LIKE_ACTIVITY = 0x08000000;
    317 
    318     /**
    319      * @hide An idea that is not yet implemented.
    320      * Flag for {@link #bindService}: If binding from an activity, consider
    321      * this service to be visible like the binding activity is.  That is,
    322      * it will be treated as something more important to keep around than
    323      * invisible background activities.  This will impact the number of
    324      * recent activities the user can switch between without having them
    325      * restart.  There is no guarantee this will be respected, as the system
    326      * tries to balance such requests from one app vs. the importantance of
    327      * keeping other apps around.
    328      */
    329     public static final int BIND_VISIBLE = 0x10000000;
    330 
    331     /**
    332      * @hide
    333      * Flag for {@link #bindService}: Consider this binding to be causing the target
    334      * process to be showing UI, so it will be do a UI_HIDDEN memory trim when it goes
    335      * away.
    336      */
    337     public static final int BIND_SHOWING_UI = 0x20000000;
    338 
    339     /**
    340      * Flag for {@link #bindService}: Don't consider the bound service to be
    341      * visible, even if the caller is visible.
    342      * @hide
    343      */
    344     public static final int BIND_NOT_VISIBLE = 0x40000000;
    345 
    346     /**
    347      * Flag for {@link #bindService}: The service being bound is an
    348      * {@link android.R.attr#isolatedProcess isolated},
    349      * {@link android.R.attr#externalService external} service.  This binds the service into the
    350      * calling application's package, rather than the package in which the service is declared.
    351      * <p>
    352      * When using this flag, the code for the service being bound will execute under the calling
    353      * application's package name and user ID.  Because the service must be an isolated process,
    354      * it will not have direct access to the application's data, though.
    355      *
    356      * The purpose of this flag is to allow applications to provide services that are attributed
    357      * to the app using the service, rather than the application providing the service.
    358      * </p>
    359      */
    360     public static final int BIND_EXTERNAL_SERVICE = 0x80000000;
    361 
    362     /**
    363      * Returns an AssetManager instance for the application's package.
    364      * <p>
    365      * <strong>Note:</strong> Implementations of this method should return
    366      * an AssetManager instance that is consistent with the Resources instance
    367      * returned by {@link #getResources()}. For example, they should share the
    368      * same {@link Configuration} object.
    369      *
    370      * @return an AssetManager instance for the application's package
    371      * @see #getResources()
    372      */
    373     public abstract AssetManager getAssets();
    374 
    375     /**
    376      * Returns a Resources instance for the application's package.
    377      * <p>
    378      * <strong>Note:</strong> Implementations of this method should return
    379      * a Resources instance that is consistent with the AssetManager instance
    380      * returned by {@link #getAssets()}. For example, they should share the
    381      * same {@link Configuration} object.
    382      *
    383      * @return a Resources instance for the application's package
    384      * @see #getAssets()
    385      */
    386     public abstract Resources getResources();
    387 
    388     /** Return PackageManager instance to find global package information. */
    389     public abstract PackageManager getPackageManager();
    390 
    391     /** Return a ContentResolver instance for your application's package. */
    392     public abstract ContentResolver getContentResolver();
    393 
    394     /**
    395      * Return the Looper for the main thread of the current process.  This is
    396      * the thread used to dispatch calls to application components (activities,
    397      * services, etc).
    398      * <p>
    399      * By definition, this method returns the same result as would be obtained
    400      * by calling {@link Looper#getMainLooper() Looper.getMainLooper()}.
    401      * </p>
    402      *
    403      * @return The main looper.
    404      */
    405     public abstract Looper getMainLooper();
    406 
    407     /**
    408      * Return the context of the single, global Application object of the
    409      * current process.  This generally should only be used if you need a
    410      * Context whose lifecycle is separate from the current context, that is
    411      * tied to the lifetime of the process rather than the current component.
    412      *
    413      * <p>Consider for example how this interacts with
    414      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)}:
    415      * <ul>
    416      * <li> <p>If used from an Activity context, the receiver is being registered
    417      * within that activity.  This means that you are expected to unregister
    418      * before the activity is done being destroyed; in fact if you do not do
    419      * so, the framework will clean up your leaked registration as it removes
    420      * the activity and log an error.  Thus, if you use the Activity context
    421      * to register a receiver that is static (global to the process, not
    422      * associated with an Activity instance) then that registration will be
    423      * removed on you at whatever point the activity you used is destroyed.
    424      * <li> <p>If used from the Context returned here, the receiver is being
    425      * registered with the global state associated with your application.  Thus
    426      * it will never be unregistered for you.  This is necessary if the receiver
    427      * is associated with static data, not a particular component.  However
    428      * using the ApplicationContext elsewhere can easily lead to serious leaks
    429      * if you forget to unregister, unbind, etc.
    430      * </ul>
    431      */
    432     public abstract Context getApplicationContext();
    433 
    434     /**
    435      * Add a new {@link ComponentCallbacks} to the base application of the
    436      * Context, which will be called at the same times as the ComponentCallbacks
    437      * methods of activities and other components are called.  Note that you
    438      * <em>must</em> be sure to use {@link #unregisterComponentCallbacks} when
    439      * appropriate in the future; this will not be removed for you.
    440      *
    441      * @param callback The interface to call.  This can be either a
    442      * {@link ComponentCallbacks} or {@link ComponentCallbacks2} interface.
    443      */
    444     public void registerComponentCallbacks(ComponentCallbacks callback) {
    445         getApplicationContext().registerComponentCallbacks(callback);
    446     }
    447 
    448     /**
    449      * Remove a {@link ComponentCallbacks} object that was previously registered
    450      * with {@link #registerComponentCallbacks(ComponentCallbacks)}.
    451      */
    452     public void unregisterComponentCallbacks(ComponentCallbacks callback) {
    453         getApplicationContext().unregisterComponentCallbacks(callback);
    454     }
    455 
    456     /**
    457      * Return a localized, styled CharSequence from the application's package's
    458      * default string table.
    459      *
    460      * @param resId Resource id for the CharSequence text
    461      */
    462     public final CharSequence getText(@StringRes int resId) {
    463         return getResources().getText(resId);
    464     }
    465 
    466     /**
    467      * Returns a localized string from the application's package's
    468      * default string table.
    469      *
    470      * @param resId Resource id for the string
    471      * @return The string data associated with the resource, stripped of styled
    472      *         text information.
    473      */
    474     @NonNull
    475     public final String getString(@StringRes int resId) {
    476         return getResources().getString(resId);
    477     }
    478 
    479     /**
    480      * Returns a localized formatted string from the application's package's
    481      * default string table, substituting the format arguments as defined in
    482      * {@link java.util.Formatter} and {@link java.lang.String#format}.
    483      *
    484      * @param resId Resource id for the format string
    485      * @param formatArgs The format arguments that will be used for
    486      *                   substitution.
    487      * @return The string data associated with the resource, formatted and
    488      *         stripped of styled text information.
    489      */
    490     @NonNull
    491     public final String getString(@StringRes int resId, Object... formatArgs) {
    492         return getResources().getString(resId, formatArgs);
    493     }
    494 
    495     /**
    496      * Returns a color associated with a particular resource ID and styled for
    497      * the current theme.
    498      *
    499      * @param id The desired resource identifier, as generated by the aapt
    500      *           tool. This integer encodes the package, type, and resource
    501      *           entry. The value 0 is an invalid identifier.
    502      * @return A single color value in the form 0xAARRGGBB.
    503      * @throws android.content.res.Resources.NotFoundException if the given ID
    504      *         does not exist.
    505      */
    506     @ColorInt
    507     public final int getColor(@ColorRes int id) {
    508         return getResources().getColor(id, getTheme());
    509     }
    510 
    511     /**
    512      * Returns a drawable object associated with a particular resource ID and
    513      * styled for the current theme.
    514      *
    515      * @param id The desired resource identifier, as generated by the aapt
    516      *           tool. This integer encodes the package, type, and resource
    517      *           entry. The value 0 is an invalid identifier.
    518      * @return An object that can be used to draw this resource, or
    519      *         {@code null} if the resource could not be resolved.
    520      * @throws android.content.res.Resources.NotFoundException if the given ID
    521      *         does not exist.
    522      */
    523     @Nullable
    524     public final Drawable getDrawable(@DrawableRes int id) {
    525         return getResources().getDrawable(id, getTheme());
    526     }
    527 
    528     /**
    529      * Returns a color state list associated with a particular resource ID and
    530      * styled for the current theme.
    531      *
    532      * @param id The desired resource identifier, as generated by the aapt
    533      *           tool. This integer encodes the package, type, and resource
    534      *           entry. The value 0 is an invalid identifier.
    535      * @return A color state list, or {@code null} if the resource could not be
    536      *         resolved.
    537      * @throws android.content.res.Resources.NotFoundException if the given ID
    538      *         does not exist.
    539      */
    540     @Nullable
    541     public final ColorStateList getColorStateList(@ColorRes int id) {
    542         return getResources().getColorStateList(id, getTheme());
    543     }
    544 
    545      /**
    546      * Set the base theme for this context.  Note that this should be called
    547      * before any views are instantiated in the Context (for example before
    548      * calling {@link android.app.Activity#setContentView} or
    549      * {@link android.view.LayoutInflater#inflate}).
    550      *
    551      * @param resid The style resource describing the theme.
    552      */
    553     public abstract void setTheme(@StyleRes int resid);
    554 
    555     /** @hide Needed for some internal implementation...  not public because
    556      * you can't assume this actually means anything. */
    557     public int getThemeResId() {
    558         return 0;
    559     }
    560 
    561     /**
    562      * Return the Theme object associated with this Context.
    563      */
    564     @ViewDebug.ExportedProperty(deepExport = true)
    565     public abstract Resources.Theme getTheme();
    566 
    567     /**
    568      * Retrieve styled attribute information in this Context's theme.  See
    569      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(int[])}
    570      * for more information.
    571      *
    572      * @see android.content.res.Resources.Theme#obtainStyledAttributes(int[])
    573      */
    574     public final TypedArray obtainStyledAttributes(@StyleableRes int[] attrs) {
    575         return getTheme().obtainStyledAttributes(attrs);
    576     }
    577 
    578     /**
    579      * Retrieve styled attribute information in this Context's theme.  See
    580      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(int, int[])}
    581      * for more information.
    582      *
    583      * @see android.content.res.Resources.Theme#obtainStyledAttributes(int, int[])
    584      */
    585     public final TypedArray obtainStyledAttributes(
    586             @StyleRes int resid, @StyleableRes int[] attrs) throws Resources.NotFoundException {
    587         return getTheme().obtainStyledAttributes(resid, attrs);
    588     }
    589 
    590     /**
    591      * Retrieve styled attribute information in this Context's theme.  See
    592      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}
    593      * for more information.
    594      *
    595      * @see android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)
    596      */
    597     public final TypedArray obtainStyledAttributes(
    598             AttributeSet set, @StyleableRes int[] attrs) {
    599         return getTheme().obtainStyledAttributes(set, attrs, 0, 0);
    600     }
    601 
    602     /**
    603      * Retrieve styled attribute information in this Context's theme.  See
    604      * {@link android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)}
    605      * for more information.
    606      *
    607      * @see android.content.res.Resources.Theme#obtainStyledAttributes(AttributeSet, int[], int, int)
    608      */
    609     public final TypedArray obtainStyledAttributes(
    610             AttributeSet set, @StyleableRes int[] attrs, @AttrRes int defStyleAttr,
    611             @StyleRes int defStyleRes) {
    612         return getTheme().obtainStyledAttributes(
    613             set, attrs, defStyleAttr, defStyleRes);
    614     }
    615 
    616     /**
    617      * Return a class loader you can use to retrieve classes in this package.
    618      */
    619     public abstract ClassLoader getClassLoader();
    620 
    621     /** Return the name of this application's package. */
    622     public abstract String getPackageName();
    623 
    624     /** @hide Return the name of the base context this context is derived from. */
    625     public abstract String getBasePackageName();
    626 
    627     /** @hide Return the package name that should be used for app ops calls from
    628      * this context.  This is the same as {@link #getBasePackageName()} except in
    629      * cases where system components are loaded into other app processes, in which
    630      * case this will be the name of the primary package in that process (so that app
    631      * ops uid verification will work with the name). */
    632     public abstract String getOpPackageName();
    633 
    634     /** Return the full application info for this context's package. */
    635     public abstract ApplicationInfo getApplicationInfo();
    636 
    637     /**
    638      * Return the full path to this context's primary Android package.
    639      * The Android package is a ZIP file which contains the application's
    640      * primary resources.
    641      *
    642      * <p>Note: this is not generally useful for applications, since they should
    643      * not be directly accessing the file system.
    644      *
    645      * @return String Path to the resources.
    646      */
    647     public abstract String getPackageResourcePath();
    648 
    649     /**
    650      * Return the full path to this context's primary Android package.
    651      * The Android package is a ZIP file which contains application's
    652      * primary code and assets.
    653      *
    654      * <p>Note: this is not generally useful for applications, since they should
    655      * not be directly accessing the file system.
    656      *
    657      * @return String Path to the code and assets.
    658      */
    659     public abstract String getPackageCodePath();
    660 
    661     /**
    662      * @hide
    663      * @deprecated use {@link #getSharedPreferencesPath(String)}
    664      */
    665     @Deprecated
    666     public File getSharedPrefsFile(String name) {
    667         return getSharedPreferencesPath(name);
    668     }
    669 
    670     /**
    671      * Retrieve and hold the contents of the preferences file 'name', returning
    672      * a SharedPreferences through which you can retrieve and modify its
    673      * values.  Only one instance of the SharedPreferences object is returned
    674      * to any callers for the same name, meaning they will see each other's
    675      * edits as soon as they are made.
    676      *
    677      * @param name Desired preferences file. If a preferences file by this name
    678      * does not exist, it will be created when you retrieve an
    679      * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
    680      * @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the
    681      * default operation.
    682      *
    683      * @return The single {@link SharedPreferences} instance that can be used
    684      *         to retrieve and modify the preference values.
    685      *
    686      * @see #MODE_PRIVATE
    687      */
    688     public abstract SharedPreferences getSharedPreferences(String name, int mode);
    689 
    690     /**
    691      * Retrieve and hold the contents of the preferences file, returning
    692      * a SharedPreferences through which you can retrieve and modify its
    693      * values.  Only one instance of the SharedPreferences object is returned
    694      * to any callers for the same name, meaning they will see each other's
    695      * edits as soon as they are made.
    696      *
    697      * @param file Desired preferences file. If a preferences file by this name
    698      * does not exist, it will be created when you retrieve an
    699      * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()).
    700      * @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the
    701      * default operation.
    702      *
    703      * @return The single {@link SharedPreferences} instance that can be used
    704      *         to retrieve and modify the preference values.
    705      *
    706      * @see #getSharedPreferencesPath(String)
    707      * @see #MODE_PRIVATE
    708      * @removed
    709      */
    710     public abstract SharedPreferences getSharedPreferences(File file, int mode);
    711 
    712     /**
    713      * Move an existing shared preferences file from the given source storage
    714      * context to this context. This is typically used to migrate data between
    715      * storage locations after an upgrade, such as moving to device protected
    716      * storage.
    717      *
    718      * @param sourceContext The source context which contains the existing
    719      *            shared preferences to move.
    720      * @param name The name of the shared preferences file.
    721      * @return {@code true} if the move was successful or if the shared
    722      *         preferences didn't exist in the source context, otherwise
    723      *         {@code false}.
    724      * @see #createDeviceProtectedStorageContext()
    725      */
    726     public abstract boolean moveSharedPreferencesFrom(Context sourceContext, String name);
    727 
    728     /** @removed */
    729     @Deprecated
    730     public boolean migrateSharedPreferencesFrom(Context sourceContext, String name) {
    731         return moveSharedPreferencesFrom(sourceContext, name);
    732     }
    733 
    734     /**
    735      * Delete an existing shared preferences file.
    736      *
    737      * @param name The name (unique in the application package) of the shared
    738      *            preferences file.
    739      * @return {@code true} if the shared preferences file was successfully
    740      *         deleted; else {@code false}.
    741      * @see #getSharedPreferences(String, int)
    742      */
    743     public abstract boolean deleteSharedPreferences(String name);
    744 
    745     /**
    746      * Open a private file associated with this Context's application package
    747      * for reading.
    748      *
    749      * @param name The name of the file to open; can not contain path
    750      *             separators.
    751      *
    752      * @return The resulting {@link FileInputStream}.
    753      *
    754      * @see #openFileOutput
    755      * @see #fileList
    756      * @see #deleteFile
    757      * @see java.io.FileInputStream#FileInputStream(String)
    758      */
    759     public abstract FileInputStream openFileInput(String name)
    760         throws FileNotFoundException;
    761 
    762     /**
    763      * Open a private file associated with this Context's application package
    764      * for writing. Creates the file if it doesn't already exist.
    765      * <p>
    766      * No additional permissions are required for the calling app to read or
    767      * write the returned file.
    768      *
    769      * @param name The name of the file to open; can not contain path
    770      *            separators.
    771      * @param mode Operating mode. Use 0 or {@link #MODE_PRIVATE} for the
    772      *            default operation. Use {@link #MODE_APPEND} to append to an
    773      *            existing file.
    774      * @return The resulting {@link FileOutputStream}.
    775      * @see #MODE_APPEND
    776      * @see #MODE_PRIVATE
    777      * @see #openFileInput
    778      * @see #fileList
    779      * @see #deleteFile
    780      * @see java.io.FileOutputStream#FileOutputStream(String)
    781      */
    782     public abstract FileOutputStream openFileOutput(String name, int mode)
    783         throws FileNotFoundException;
    784 
    785     /**
    786      * Delete the given private file associated with this Context's
    787      * application package.
    788      *
    789      * @param name The name of the file to delete; can not contain path
    790      *             separators.
    791      *
    792      * @return {@code true} if the file was successfully deleted; else
    793      *         {@code false}.
    794      *
    795      * @see #openFileInput
    796      * @see #openFileOutput
    797      * @see #fileList
    798      * @see java.io.File#delete()
    799      */
    800     public abstract boolean deleteFile(String name);
    801 
    802     /**
    803      * Returns the absolute path on the filesystem where a file created with
    804      * {@link #openFileOutput} is stored.
    805      * <p>
    806      * The returned path may change over time if the calling app is moved to an
    807      * adopted storage device, so only relative paths should be persisted.
    808      *
    809      * @param name The name of the file for which you would like to get
    810      *          its path.
    811      *
    812      * @return An absolute path to the given file.
    813      *
    814      * @see #openFileOutput
    815      * @see #getFilesDir
    816      * @see #getDir
    817      */
    818     public abstract File getFileStreamPath(String name);
    819 
    820     /**
    821      * Returns the absolute path on the filesystem where a file created with
    822      * {@link #getSharedPreferences(String, int)} is stored.
    823      * <p>
    824      * The returned path may change over time if the calling app is moved to an
    825      * adopted storage device, so only relative paths should be persisted.
    826      *
    827      * @param name The name of the shared preferences for which you would like
    828      *            to get a path.
    829      * @return An absolute path to the given file.
    830      * @see #getSharedPreferences(String, int)
    831      * @removed
    832      */
    833     public abstract File getSharedPreferencesPath(String name);
    834 
    835     /**
    836      * Returns the absolute path to the directory on the filesystem where all
    837      * private files belonging to this app are stored. Apps should not use this
    838      * path directly; they should instead use {@link #getFilesDir()},
    839      * {@link #getCacheDir()}, {@link #getDir(String, int)}, or other storage
    840      * APIs on this class.
    841      * <p>
    842      * The returned path may change over time if the calling app is moved to an
    843      * adopted storage device, so only relative paths should be persisted.
    844      * <p>
    845      * No additional permissions are required for the calling app to read or
    846      * write files under the returned path.
    847      *
    848      * @see ApplicationInfo#dataDir
    849      */
    850     public abstract File getDataDir();
    851 
    852     /**
    853      * Returns the absolute path to the directory on the filesystem where files
    854      * created with {@link #openFileOutput} are stored.
    855      * <p>
    856      * The returned path may change over time if the calling app is moved to an
    857      * adopted storage device, so only relative paths should be persisted.
    858      * <p>
    859      * No additional permissions are required for the calling app to read or
    860      * write files under the returned path.
    861      *
    862      * @return The path of the directory holding application files.
    863      * @see #openFileOutput
    864      * @see #getFileStreamPath
    865      * @see #getDir
    866      */
    867     public abstract File getFilesDir();
    868 
    869     /**
    870      * Returns the absolute path to the directory on the filesystem similar to
    871      * {@link #getFilesDir()}. The difference is that files placed under this
    872      * directory will be excluded from automatic backup to remote storage. See
    873      * {@link android.app.backup.BackupAgent BackupAgent} for a full discussion
    874      * of the automatic backup mechanism in Android.
    875      * <p>
    876      * The returned path may change over time if the calling app is moved to an
    877      * adopted storage device, so only relative paths should be persisted.
    878      * <p>
    879      * No additional permissions are required for the calling app to read or
    880      * write files under the returned path.
    881      *
    882      * @return The path of the directory holding application files that will not
    883      *         be automatically backed up to remote storage.
    884      * @see #openFileOutput
    885      * @see #getFileStreamPath
    886      * @see #getDir
    887      * @see android.app.backup.BackupAgent
    888      */
    889     public abstract File getNoBackupFilesDir();
    890 
    891     /**
    892      * Returns the absolute path to the directory on the primary shared/external
    893      * storage device where the application can place persistent files it owns.
    894      * These files are internal to the applications, and not typically visible
    895      * to the user as media.
    896      * <p>
    897      * This is like {@link #getFilesDir()} in that these files will be deleted
    898      * when the application is uninstalled, however there are some important
    899      * differences:
    900      * <ul>
    901      * <li>Shared storage may not always be available, since removable media can
    902      * be ejected by the user. Media state can be checked using
    903      * {@link Environment#getExternalStorageState(File)}.
    904      * <li>There is no security enforced with these files. For example, any
    905      * application holding
    906      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
    907      * these files.
    908      * </ul>
    909      * <p>
    910      * If a shared storage device is emulated (as determined by
    911      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
    912      * backed by a private user data partition, which means there is little
    913      * benefit to storing data here instead of the private directories returned
    914      * by {@link #getFilesDir()}, etc.
    915      * <p>
    916      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
    917      * are required to read or write to the returned path; it's always
    918      * accessible to the calling app. This only applies to paths generated for
    919      * package name of the calling application. To access paths belonging to
    920      * other packages,
    921      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
    922      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
    923      * <p>
    924      * On devices with multiple users (as described by {@link UserManager}),
    925      * each user has their own isolated shared storage. Applications only have
    926      * access to the shared storage for the user they're running as.
    927      * <p>
    928      * The returned path may change over time if different shared storage media
    929      * is inserted, so only relative paths should be persisted.
    930      * <p>
    931      * Here is an example of typical code to manipulate a file in an
    932      * application's shared storage:
    933      * </p>
    934      * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java
    935      * private_file}
    936      * <p>
    937      * If you supply a non-null <var>type</var> to this function, the returned
    938      * file will be a path to a sub-directory of the given type. Though these
    939      * files are not automatically scanned by the media scanner, you can
    940      * explicitly add them to the media database with
    941      * {@link android.media.MediaScannerConnection#scanFile(Context, String[], String[], android.media.MediaScannerConnection.OnScanCompletedListener)
    942      * MediaScannerConnection.scanFile}. Note that this is not the same as
    943      * {@link android.os.Environment#getExternalStoragePublicDirectory
    944      * Environment.getExternalStoragePublicDirectory()}, which provides
    945      * directories of media shared by all applications. The directories returned
    946      * here are owned by the application, and their contents will be removed
    947      * when the application is uninstalled. Unlike
    948      * {@link android.os.Environment#getExternalStoragePublicDirectory
    949      * Environment.getExternalStoragePublicDirectory()}, the directory returned
    950      * here will be automatically created for you.
    951      * <p>
    952      * Here is an example of typical code to manipulate a picture in an
    953      * application's shared storage and add it to the media database:
    954      * </p>
    955      * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java
    956      * private_picture}
    957      *
    958      * @param type The type of files directory to return. May be {@code null}
    959      *            for the root of the files directory or one of the following
    960      *            constants for a subdirectory:
    961      *            {@link android.os.Environment#DIRECTORY_MUSIC},
    962      *            {@link android.os.Environment#DIRECTORY_PODCASTS},
    963      *            {@link android.os.Environment#DIRECTORY_RINGTONES},
    964      *            {@link android.os.Environment#DIRECTORY_ALARMS},
    965      *            {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
    966      *            {@link android.os.Environment#DIRECTORY_PICTURES}, or
    967      *            {@link android.os.Environment#DIRECTORY_MOVIES}.
    968      * @return the absolute path to application-specific directory. May return
    969      *         {@code null} if shared storage is not currently available.
    970      * @see #getFilesDir
    971      * @see #getExternalFilesDirs(String)
    972      * @see Environment#getExternalStorageState(File)
    973      * @see Environment#isExternalStorageEmulated(File)
    974      * @see Environment#isExternalStorageRemovable(File)
    975      */
    976     @Nullable
    977     public abstract File getExternalFilesDir(@Nullable String type);
    978 
    979     /**
    980      * Returns absolute paths to application-specific directories on all
    981      * shared/external storage devices where the application can place
    982      * persistent files it owns. These files are internal to the application,
    983      * and not typically visible to the user as media.
    984      * <p>
    985      * This is like {@link #getFilesDir()} in that these files will be deleted
    986      * when the application is uninstalled, however there are some important
    987      * differences:
    988      * <ul>
    989      * <li>Shared storage may not always be available, since removable media can
    990      * be ejected by the user. Media state can be checked using
    991      * {@link Environment#getExternalStorageState(File)}.
    992      * <li>There is no security enforced with these files. For example, any
    993      * application holding
    994      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
    995      * these files.
    996      * </ul>
    997      * <p>
    998      * If a shared storage device is emulated (as determined by
    999      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
   1000      * backed by a private user data partition, which means there is little
   1001      * benefit to storing data here instead of the private directories returned
   1002      * by {@link #getFilesDir()}, etc.
   1003      * <p>
   1004      * Shared storage devices returned here are considered a stable part of the
   1005      * device, including physical media slots under a protective cover. The
   1006      * returned paths do not include transient devices, such as USB flash drives
   1007      * connected to handheld devices.
   1008      * <p>
   1009      * An application may store data on any or all of the returned devices. For
   1010      * example, an app may choose to store large files on the device with the
   1011      * most available space, as measured by {@link StatFs}.
   1012      * <p>
   1013      * No additional permissions are required for the calling app to read or
   1014      * write files under the returned path. Write access outside of these paths
   1015      * on secondary external storage devices is not available.
   1016      * <p>
   1017      * The returned path may change over time if different shared storage media
   1018      * is inserted, so only relative paths should be persisted.
   1019      *
   1020      * @param type The type of files directory to return. May be {@code null}
   1021      *            for the root of the files directory or one of the following
   1022      *            constants for a subdirectory:
   1023      *            {@link android.os.Environment#DIRECTORY_MUSIC},
   1024      *            {@link android.os.Environment#DIRECTORY_PODCASTS},
   1025      *            {@link android.os.Environment#DIRECTORY_RINGTONES},
   1026      *            {@link android.os.Environment#DIRECTORY_ALARMS},
   1027      *            {@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
   1028      *            {@link android.os.Environment#DIRECTORY_PICTURES}, or
   1029      *            {@link android.os.Environment#DIRECTORY_MOVIES}.
   1030      * @return the absolute paths to application-specific directories. Some
   1031      *         individual paths may be {@code null} if that shared storage is
   1032      *         not currently available. The first path returned is the same as
   1033      *         {@link #getExternalFilesDir(String)}.
   1034      * @see #getExternalFilesDir(String)
   1035      * @see Environment#getExternalStorageState(File)
   1036      * @see Environment#isExternalStorageEmulated(File)
   1037      * @see Environment#isExternalStorageRemovable(File)
   1038      */
   1039     public abstract File[] getExternalFilesDirs(String type);
   1040 
   1041     /**
   1042      * Return the primary shared/external storage directory where this
   1043      * application's OBB files (if there are any) can be found. Note if the
   1044      * application does not have any OBB files, this directory may not exist.
   1045      * <p>
   1046      * This is like {@link #getFilesDir()} in that these files will be deleted
   1047      * when the application is uninstalled, however there are some important
   1048      * differences:
   1049      * <ul>
   1050      * <li>Shared storage may not always be available, since removable media can
   1051      * be ejected by the user. Media state can be checked using
   1052      * {@link Environment#getExternalStorageState(File)}.
   1053      * <li>There is no security enforced with these files. For example, any
   1054      * application holding
   1055      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1056      * these files.
   1057      * </ul>
   1058      * <p>
   1059      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
   1060      * are required to read or write to the returned path; it's always
   1061      * accessible to the calling app. This only applies to paths generated for
   1062      * package name of the calling application. To access paths belonging to
   1063      * other packages,
   1064      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
   1065      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
   1066      * <p>
   1067      * On devices with multiple users (as described by {@link UserManager}),
   1068      * multiple users may share the same OBB storage location. Applications
   1069      * should ensure that multiple instances running under different users don't
   1070      * interfere with each other.
   1071      *
   1072      * @return the absolute path to application-specific directory. May return
   1073      *         {@code null} if shared storage is not currently available.
   1074      * @see #getObbDirs()
   1075      * @see Environment#getExternalStorageState(File)
   1076      * @see Environment#isExternalStorageEmulated(File)
   1077      * @see Environment#isExternalStorageRemovable(File)
   1078      */
   1079     public abstract File getObbDir();
   1080 
   1081     /**
   1082      * Returns absolute paths to application-specific directories on all
   1083      * shared/external storage devices where the application's OBB files (if
   1084      * there are any) can be found. Note if the application does not have any
   1085      * OBB files, these directories may not exist.
   1086      * <p>
   1087      * This is like {@link #getFilesDir()} in that these files will be deleted
   1088      * when the application is uninstalled, however there are some important
   1089      * differences:
   1090      * <ul>
   1091      * <li>Shared storage may not always be available, since removable media can
   1092      * be ejected by the user. Media state can be checked using
   1093      * {@link Environment#getExternalStorageState(File)}.
   1094      * <li>There is no security enforced with these files. For example, any
   1095      * application holding
   1096      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1097      * these files.
   1098      * </ul>
   1099      * <p>
   1100      * Shared storage devices returned here are considered a stable part of the
   1101      * device, including physical media slots under a protective cover. The
   1102      * returned paths do not include transient devices, such as USB flash drives
   1103      * connected to handheld devices.
   1104      * <p>
   1105      * An application may store data on any or all of the returned devices. For
   1106      * example, an app may choose to store large files on the device with the
   1107      * most available space, as measured by {@link StatFs}.
   1108      * <p>
   1109      * No additional permissions are required for the calling app to read or
   1110      * write files under the returned path. Write access outside of these paths
   1111      * on secondary external storage devices is not available.
   1112      *
   1113      * @return the absolute paths to application-specific directories. Some
   1114      *         individual paths may be {@code null} if that shared storage is
   1115      *         not currently available. The first path returned is the same as
   1116      *         {@link #getObbDir()}
   1117      * @see #getObbDir()
   1118      * @see Environment#getExternalStorageState(File)
   1119      * @see Environment#isExternalStorageEmulated(File)
   1120      * @see Environment#isExternalStorageRemovable(File)
   1121      */
   1122     public abstract File[] getObbDirs();
   1123 
   1124     /**
   1125      * Returns the absolute path to the application specific cache directory on
   1126      * the filesystem. These files will be ones that get deleted first when the
   1127      * device runs low on storage. There is no guarantee when these files will
   1128      * be deleted.
   1129      * <p>
   1130      * <strong>Note: you should not <em>rely</em> on the system deleting these
   1131      * files for you; you should always have a reasonable maximum, such as 1 MB,
   1132      * for the amount of space you consume with cache files, and prune those
   1133      * files when exceeding that space.</strong>
   1134      * <p>
   1135      * The returned path may change over time if the calling app is moved to an
   1136      * adopted storage device, so only relative paths should be persisted.
   1137      * <p>
   1138      * Apps require no extra permissions to read or write to the returned path,
   1139      * since this path lives in their private storage.
   1140      *
   1141      * @return The path of the directory holding application cache files.
   1142      * @see #openFileOutput
   1143      * @see #getFileStreamPath
   1144      * @see #getDir
   1145      */
   1146     public abstract File getCacheDir();
   1147 
   1148     /**
   1149      * Returns the absolute path to the application specific cache directory on
   1150      * the filesystem designed for storing cached code. The system will delete
   1151      * any files stored in this location both when your specific application is
   1152      * upgraded, and when the entire platform is upgraded.
   1153      * <p>
   1154      * This location is optimal for storing compiled or optimized code generated
   1155      * by your application at runtime.
   1156      * <p>
   1157      * The returned path may change over time if the calling app is moved to an
   1158      * adopted storage device, so only relative paths should be persisted.
   1159      * <p>
   1160      * Apps require no extra permissions to read or write to the returned path,
   1161      * since this path lives in their private storage.
   1162      *
   1163      * @return The path of the directory holding application code cache files.
   1164      */
   1165     public abstract File getCodeCacheDir();
   1166 
   1167     /**
   1168      * Returns absolute path to application-specific directory on the primary
   1169      * shared/external storage device where the application can place cache
   1170      * files it owns. These files are internal to the application, and not
   1171      * typically visible to the user as media.
   1172      * <p>
   1173      * This is like {@link #getCacheDir()} in that these files will be deleted
   1174      * when the application is uninstalled, however there are some important
   1175      * differences:
   1176      * <ul>
   1177      * <li>The platform does not always monitor the space available in shared
   1178      * storage, and thus may not automatically delete these files. Apps should
   1179      * always manage the maximum space used in this location. Currently the only
   1180      * time files here will be deleted by the platform is when running on
   1181      * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} or later and
   1182      * {@link Environment#isExternalStorageEmulated(File)} returns true.
   1183      * <li>Shared storage may not always be available, since removable media can
   1184      * be ejected by the user. Media state can be checked using
   1185      * {@link Environment#getExternalStorageState(File)}.
   1186      * <li>There is no security enforced with these files. For example, any
   1187      * application holding
   1188      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1189      * these files.
   1190      * </ul>
   1191      * <p>
   1192      * If a shared storage device is emulated (as determined by
   1193      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
   1194      * backed by a private user data partition, which means there is little
   1195      * benefit to storing data here instead of the private directory returned by
   1196      * {@link #getCacheDir()}.
   1197      * <p>
   1198      * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
   1199      * are required to read or write to the returned path; it's always
   1200      * accessible to the calling app. This only applies to paths generated for
   1201      * package name of the calling application. To access paths belonging to
   1202      * other packages,
   1203      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} and/or
   1204      * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required.
   1205      * <p>
   1206      * On devices with multiple users (as described by {@link UserManager}),
   1207      * each user has their own isolated shared storage. Applications only have
   1208      * access to the shared storage for the user they're running as.
   1209      * <p>
   1210      * The returned path may change over time if different shared storage media
   1211      * is inserted, so only relative paths should be persisted.
   1212      *
   1213      * @return the absolute path to application-specific directory. May return
   1214      *         {@code null} if shared storage is not currently available.
   1215      * @see #getCacheDir
   1216      * @see #getExternalCacheDirs()
   1217      * @see Environment#getExternalStorageState(File)
   1218      * @see Environment#isExternalStorageEmulated(File)
   1219      * @see Environment#isExternalStorageRemovable(File)
   1220      */
   1221     @Nullable
   1222     public abstract File getExternalCacheDir();
   1223 
   1224     /**
   1225      * Returns absolute paths to application-specific directories on all
   1226      * shared/external storage devices where the application can place cache
   1227      * files it owns. These files are internal to the application, and not
   1228      * typically visible to the user as media.
   1229      * <p>
   1230      * This is like {@link #getCacheDir()} in that these files will be deleted
   1231      * when the application is uninstalled, however there are some important
   1232      * differences:
   1233      * <ul>
   1234      * <li>The platform does not always monitor the space available in shared
   1235      * storage, and thus may not automatically delete these files. Apps should
   1236      * always manage the maximum space used in this location. Currently the only
   1237      * time files here will be deleted by the platform is when running on
   1238      * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} or later and
   1239      * {@link Environment#isExternalStorageEmulated(File)} returns true.
   1240      * <li>Shared storage may not always be available, since removable media can
   1241      * be ejected by the user. Media state can be checked using
   1242      * {@link Environment#getExternalStorageState(File)}.
   1243      * <li>There is no security enforced with these files. For example, any
   1244      * application holding
   1245      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1246      * these files.
   1247      * </ul>
   1248      * <p>
   1249      * If a shared storage device is emulated (as determined by
   1250      * {@link Environment#isExternalStorageEmulated(File)}), it's contents are
   1251      * backed by a private user data partition, which means there is little
   1252      * benefit to storing data here instead of the private directory returned by
   1253      * {@link #getCacheDir()}.
   1254      * <p>
   1255      * Shared storage devices returned here are considered a stable part of the
   1256      * device, including physical media slots under a protective cover. The
   1257      * returned paths do not include transient devices, such as USB flash drives
   1258      * connected to handheld devices.
   1259      * <p>
   1260      * An application may store data on any or all of the returned devices. For
   1261      * example, an app may choose to store large files on the device with the
   1262      * most available space, as measured by {@link StatFs}.
   1263      * <p>
   1264      * No additional permissions are required for the calling app to read or
   1265      * write files under the returned path. Write access outside of these paths
   1266      * on secondary external storage devices is not available.
   1267      * <p>
   1268      * The returned paths may change over time if different shared storage media
   1269      * is inserted, so only relative paths should be persisted.
   1270      *
   1271      * @return the absolute paths to application-specific directories. Some
   1272      *         individual paths may be {@code null} if that shared storage is
   1273      *         not currently available. The first path returned is the same as
   1274      *         {@link #getExternalCacheDir()}.
   1275      * @see #getExternalCacheDir()
   1276      * @see Environment#getExternalStorageState(File)
   1277      * @see Environment#isExternalStorageEmulated(File)
   1278      * @see Environment#isExternalStorageRemovable(File)
   1279      */
   1280     public abstract File[] getExternalCacheDirs();
   1281 
   1282     /**
   1283      * Returns absolute paths to application-specific directories on all
   1284      * shared/external storage devices where the application can place media
   1285      * files. These files are scanned and made available to other apps through
   1286      * {@link MediaStore}.
   1287      * <p>
   1288      * This is like {@link #getExternalFilesDirs} in that these files will be
   1289      * deleted when the application is uninstalled, however there are some
   1290      * important differences:
   1291      * <ul>
   1292      * <li>Shared storage may not always be available, since removable media can
   1293      * be ejected by the user. Media state can be checked using
   1294      * {@link Environment#getExternalStorageState(File)}.
   1295      * <li>There is no security enforced with these files. For example, any
   1296      * application holding
   1297      * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} can write to
   1298      * these files.
   1299      * </ul>
   1300      * <p>
   1301      * Shared storage devices returned here are considered a stable part of the
   1302      * device, including physical media slots under a protective cover. The
   1303      * returned paths do not include transient devices, such as USB flash drives
   1304      * connected to handheld devices.
   1305      * <p>
   1306      * An application may store data on any or all of the returned devices. For
   1307      * example, an app may choose to store large files on the device with the
   1308      * most available space, as measured by {@link StatFs}.
   1309      * <p>
   1310      * No additional permissions are required for the calling app to read or
   1311      * write files under the returned path. Write access outside of these paths
   1312      * on secondary external storage devices is not available.
   1313      * <p>
   1314      * The returned paths may change over time if different shared storage media
   1315      * is inserted, so only relative paths should be persisted.
   1316      *
   1317      * @return the absolute paths to application-specific directories. Some
   1318      *         individual paths may be {@code null} if that shared storage is
   1319      *         not currently available.
   1320      * @see Environment#getExternalStorageState(File)
   1321      * @see Environment#isExternalStorageEmulated(File)
   1322      * @see Environment#isExternalStorageRemovable(File)
   1323      */
   1324     public abstract File[] getExternalMediaDirs();
   1325 
   1326     /**
   1327      * Returns an array of strings naming the private files associated with
   1328      * this Context's application package.
   1329      *
   1330      * @return Array of strings naming the private files.
   1331      *
   1332      * @see #openFileInput
   1333      * @see #openFileOutput
   1334      * @see #deleteFile
   1335      */
   1336     public abstract String[] fileList();
   1337 
   1338     /**
   1339      * Retrieve, creating if needed, a new directory in which the application
   1340      * can place its own custom data files.  You can use the returned File
   1341      * object to create and access files in this directory.  Note that files
   1342      * created through a File object will only be accessible by your own
   1343      * application; you can only set the mode of the entire directory, not
   1344      * of individual files.
   1345      * <p>
   1346      * The returned path may change over time if the calling app is moved to an
   1347      * adopted storage device, so only relative paths should be persisted.
   1348      * <p>
   1349      * Apps require no extra permissions to read or write to the returned path,
   1350      * since this path lives in their private storage.
   1351      *
   1352      * @param name Name of the directory to retrieve.  This is a directory
   1353      * that is created as part of your application data.
   1354      * @param mode Operating mode.  Use 0 or {@link #MODE_PRIVATE} for the
   1355      * default operation.
   1356      *
   1357      * @return A {@link File} object for the requested directory.  The directory
   1358      * will have been created if it does not already exist.
   1359      *
   1360      * @see #openFileOutput(String, int)
   1361      */
   1362     public abstract File getDir(String name, int mode);
   1363 
   1364     /**
   1365      * Open a new private SQLiteDatabase associated with this Context's
   1366      * application package. Create the database file if it doesn't exist.
   1367      *
   1368      * @param name The name (unique in the application package) of the database.
   1369      * @param mode Operating mode. Use 0 or {@link #MODE_PRIVATE} for the
   1370      *            default operation. Use
   1371      *            {@link #MODE_ENABLE_WRITE_AHEAD_LOGGING} to enable write-ahead
   1372      *            logging by default. Use {@link #MODE_NO_LOCALIZED_COLLATORS}
   1373      *            to disable localized collators.
   1374      * @param factory An optional factory class that is called to instantiate a
   1375      *            cursor when query is called.
   1376      * @return The contents of a newly created database with the given name.
   1377      * @throws android.database.sqlite.SQLiteException if the database file
   1378      *             could not be opened.
   1379      * @see #MODE_PRIVATE
   1380      * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING
   1381      * @see #MODE_NO_LOCALIZED_COLLATORS
   1382      * @see #deleteDatabase
   1383      */
   1384     public abstract SQLiteDatabase openOrCreateDatabase(String name,
   1385             int mode, CursorFactory factory);
   1386 
   1387     /**
   1388      * Open a new private SQLiteDatabase associated with this Context's
   1389      * application package. Creates the database file if it doesn't exist.
   1390      * <p>
   1391      * Accepts input param: a concrete instance of {@link DatabaseErrorHandler}
   1392      * to be used to handle corruption when sqlite reports database corruption.
   1393      * </p>
   1394      *
   1395      * @param name The name (unique in the application package) of the database.
   1396      * @param mode Operating mode. Use 0 or {@link #MODE_PRIVATE} for the
   1397      *            default operation. Use
   1398      *            {@link #MODE_ENABLE_WRITE_AHEAD_LOGGING} to enable write-ahead
   1399      *            logging by default. Use {@link #MODE_NO_LOCALIZED_COLLATORS}
   1400      *            to disable localized collators.
   1401      * @param factory An optional factory class that is called to instantiate a
   1402      *            cursor when query is called.
   1403      * @param errorHandler the {@link DatabaseErrorHandler} to be used when
   1404      *            sqlite reports database corruption. if null,
   1405      *            {@link android.database.DefaultDatabaseErrorHandler} is
   1406      *            assumed.
   1407      * @return The contents of a newly created database with the given name.
   1408      * @throws android.database.sqlite.SQLiteException if the database file
   1409      *             could not be opened.
   1410      * @see #MODE_PRIVATE
   1411      * @see #MODE_ENABLE_WRITE_AHEAD_LOGGING
   1412      * @see #MODE_NO_LOCALIZED_COLLATORS
   1413      * @see #deleteDatabase
   1414      */
   1415     public abstract SQLiteDatabase openOrCreateDatabase(String name,
   1416             int mode, CursorFactory factory,
   1417             @Nullable DatabaseErrorHandler errorHandler);
   1418 
   1419     /**
   1420      * Move an existing database file from the given source storage context to
   1421      * this context. This is typically used to migrate data between storage
   1422      * locations after an upgrade, such as migrating to device protected
   1423      * storage.
   1424      * <p>
   1425      * The database must be closed before being moved.
   1426      *
   1427      * @param sourceContext The source context which contains the existing
   1428      *            database to move.
   1429      * @param name The name of the database file.
   1430      * @return {@code true} if the move was successful or if the database didn't
   1431      *         exist in the source context, otherwise {@code false}.
   1432      * @see #createDeviceProtectedStorageContext()
   1433      */
   1434     public abstract boolean moveDatabaseFrom(Context sourceContext, String name);
   1435 
   1436     /** @removed */
   1437     @Deprecated
   1438     public boolean migrateDatabaseFrom(Context sourceContext, String name) {
   1439         return moveDatabaseFrom(sourceContext, name);
   1440     }
   1441 
   1442     /**
   1443      * Delete an existing private SQLiteDatabase associated with this Context's
   1444      * application package.
   1445      *
   1446      * @param name The name (unique in the application package) of the
   1447      *             database.
   1448      *
   1449      * @return {@code true} if the database was successfully deleted; else {@code false}.
   1450      *
   1451      * @see #openOrCreateDatabase
   1452      */
   1453     public abstract boolean deleteDatabase(String name);
   1454 
   1455     /**
   1456      * Returns the absolute path on the filesystem where a database created with
   1457      * {@link #openOrCreateDatabase} is stored.
   1458      * <p>
   1459      * The returned path may change over time if the calling app is moved to an
   1460      * adopted storage device, so only relative paths should be persisted.
   1461      *
   1462      * @param name The name of the database for which you would like to get
   1463      *          its path.
   1464      *
   1465      * @return An absolute path to the given database.
   1466      *
   1467      * @see #openOrCreateDatabase
   1468      */
   1469     public abstract File getDatabasePath(String name);
   1470 
   1471     /**
   1472      * Returns an array of strings naming the private databases associated with
   1473      * this Context's application package.
   1474      *
   1475      * @return Array of strings naming the private databases.
   1476      *
   1477      * @see #openOrCreateDatabase
   1478      * @see #deleteDatabase
   1479      */
   1480     public abstract String[] databaseList();
   1481 
   1482     /**
   1483      * @deprecated Use {@link android.app.WallpaperManager#getDrawable
   1484      * WallpaperManager.get()} instead.
   1485      */
   1486     @Deprecated
   1487     public abstract Drawable getWallpaper();
   1488 
   1489     /**
   1490      * @deprecated Use {@link android.app.WallpaperManager#peekDrawable
   1491      * WallpaperManager.peek()} instead.
   1492      */
   1493     @Deprecated
   1494     public abstract Drawable peekWallpaper();
   1495 
   1496     /**
   1497      * @deprecated Use {@link android.app.WallpaperManager#getDesiredMinimumWidth()
   1498      * WallpaperManager.getDesiredMinimumWidth()} instead.
   1499      */
   1500     @Deprecated
   1501     public abstract int getWallpaperDesiredMinimumWidth();
   1502 
   1503     /**
   1504      * @deprecated Use {@link android.app.WallpaperManager#getDesiredMinimumHeight()
   1505      * WallpaperManager.getDesiredMinimumHeight()} instead.
   1506      */
   1507     @Deprecated
   1508     public abstract int getWallpaperDesiredMinimumHeight();
   1509 
   1510     /**
   1511      * @deprecated Use {@link android.app.WallpaperManager#setBitmap(Bitmap)
   1512      * WallpaperManager.set()} instead.
   1513      * <p>This method requires the caller to hold the permission
   1514      * {@link android.Manifest.permission#SET_WALLPAPER}.
   1515      */
   1516     @Deprecated
   1517     public abstract void setWallpaper(Bitmap bitmap) throws IOException;
   1518 
   1519     /**
   1520      * @deprecated Use {@link android.app.WallpaperManager#setStream(InputStream)
   1521      * WallpaperManager.set()} instead.
   1522      * <p>This method requires the caller to hold the permission
   1523      * {@link android.Manifest.permission#SET_WALLPAPER}.
   1524      */
   1525     @Deprecated
   1526     public abstract void setWallpaper(InputStream data) throws IOException;
   1527 
   1528     /**
   1529      * @deprecated Use {@link android.app.WallpaperManager#clear
   1530      * WallpaperManager.clear()} instead.
   1531      * <p>This method requires the caller to hold the permission
   1532      * {@link android.Manifest.permission#SET_WALLPAPER}.
   1533      */
   1534     @Deprecated
   1535     public abstract void clearWallpaper() throws IOException;
   1536 
   1537     /**
   1538      * Same as {@link #startActivity(Intent, Bundle)} with no options
   1539      * specified.
   1540      *
   1541      * @param intent The description of the activity to start.
   1542      *
   1543      * @throws ActivityNotFoundException &nbsp;
   1544      *`
   1545      * @see #startActivity(Intent, Bundle)
   1546      * @see PackageManager#resolveActivity
   1547      */
   1548     public abstract void startActivity(@RequiresPermission Intent intent);
   1549 
   1550     /**
   1551      * Version of {@link #startActivity(Intent)} that allows you to specify the
   1552      * user the activity will be started for.  This is not available to applications
   1553      * that are not pre-installed on the system image.  Using it requires holding
   1554      * the INTERACT_ACROSS_USERS_FULL permission.
   1555      * @param intent The description of the activity to start.
   1556      * @param user The UserHandle of the user to start this activity for.
   1557      * @throws ActivityNotFoundException &nbsp;
   1558      * @hide
   1559      */
   1560     public void startActivityAsUser(@RequiresPermission Intent intent, UserHandle user) {
   1561         throw new RuntimeException("Not implemented. Must override in a subclass.");
   1562     }
   1563 
   1564     /**
   1565      * Launch a new activity.  You will not receive any information about when
   1566      * the activity exits.
   1567      *
   1568      * <p>Note that if this method is being called from outside of an
   1569      * {@link android.app.Activity} Context, then the Intent must include
   1570      * the {@link Intent#FLAG_ACTIVITY_NEW_TASK} launch flag.  This is because,
   1571      * without being started from an existing Activity, there is no existing
   1572      * task in which to place the new activity and thus it needs to be placed
   1573      * in its own separate task.
   1574      *
   1575      * <p>This method throws {@link ActivityNotFoundException}
   1576      * if there was no Activity found to run the given Intent.
   1577      *
   1578      * @param intent The description of the activity to start.
   1579      * @param options Additional options for how the Activity should be started.
   1580      * May be null if there are no options.  See {@link android.app.ActivityOptions}
   1581      * for how to build the Bundle supplied here; there are no supported definitions
   1582      * for building it manually.
   1583      *
   1584      * @throws ActivityNotFoundException &nbsp;
   1585      *
   1586      * @see #startActivity(Intent)
   1587      * @see PackageManager#resolveActivity
   1588      */
   1589     public abstract void startActivity(@RequiresPermission Intent intent,
   1590             @Nullable Bundle options);
   1591 
   1592     /**
   1593      * Version of {@link #startActivity(Intent, Bundle)} that allows you to specify the
   1594      * user the activity will be started for.  This is not available to applications
   1595      * that are not pre-installed on the system image.  Using it requires holding
   1596      * the INTERACT_ACROSS_USERS_FULL permission.
   1597      * @param intent The description of the activity to start.
   1598      * @param options Additional options for how the Activity should be started.
   1599      * May be null if there are no options.  See {@link android.app.ActivityOptions}
   1600      * for how to build the Bundle supplied here; there are no supported definitions
   1601      * for building it manually.
   1602      * @param userId The UserHandle of the user to start this activity for.
   1603      * @throws ActivityNotFoundException &nbsp;
   1604      * @hide
   1605      */
   1606     public void startActivityAsUser(@RequiresPermission Intent intent, @Nullable Bundle options,
   1607             UserHandle userId) {
   1608         throw new RuntimeException("Not implemented. Must override in a subclass.");
   1609     }
   1610 
   1611     /**
   1612      * Version of {@link #startActivity(Intent, Bundle)} that returns a result to the caller. This
   1613      * is only supported for Views and Fragments.
   1614      * @param who The identifier for the calling element that will receive the result.
   1615      * @param intent The intent to start.
   1616      * @param requestCode The code that will be returned with onActivityResult() identifying this
   1617      *          request.
   1618      * @param options Additional options for how the Activity should be started.
   1619      *          May be null if there are no options.  See {@link android.app.ActivityOptions}
   1620      *          for how to build the Bundle supplied here; there are no supported definitions
   1621      *          for building it manually.
   1622      * @hide
   1623      */
   1624     public void startActivityForResult(
   1625             @NonNull String who, Intent intent, int requestCode, @Nullable Bundle options) {
   1626         throw new RuntimeException("This method is only implemented for Activity-based Contexts. "
   1627                 + "Check canStartActivityForResult() before calling.");
   1628     }
   1629 
   1630     /**
   1631      * Identifies whether this Context instance will be able to process calls to
   1632      * {@link #startActivityForResult(String, Intent, int, Bundle)}.
   1633      * @hide
   1634      */
   1635     public boolean canStartActivityForResult() {
   1636         return false;
   1637     }
   1638 
   1639     /**
   1640      * Same as {@link #startActivities(Intent[], Bundle)} with no options
   1641      * specified.
   1642      *
   1643      * @param intents An array of Intents to be started.
   1644      *
   1645      * @throws ActivityNotFoundException &nbsp;
   1646      *
   1647      * @see #startActivities(Intent[], Bundle)
   1648      * @see PackageManager#resolveActivity
   1649      */
   1650     public abstract void startActivities(@RequiresPermission Intent[] intents);
   1651 
   1652     /**
   1653      * Launch multiple new activities.  This is generally the same as calling
   1654      * {@link #startActivity(Intent)} for the first Intent in the array,
   1655      * that activity during its creation calling {@link #startActivity(Intent)}
   1656      * for the second entry, etc.  Note that unlike that approach, generally
   1657      * none of the activities except the last in the array will be created
   1658      * at this point, but rather will be created when the user first visits
   1659      * them (due to pressing back from the activity on top).
   1660      *
   1661      * <p>This method throws {@link ActivityNotFoundException}
   1662      * if there was no Activity found for <em>any</em> given Intent.  In this
   1663      * case the state of the activity stack is undefined (some Intents in the
   1664      * list may be on it, some not), so you probably want to avoid such situations.
   1665      *
   1666      * @param intents An array of Intents to be started.
   1667      * @param options Additional options for how the Activity should be started.
   1668      * See {@link android.content.Context#startActivity(Intent, Bundle)
   1669      * Context.startActivity(Intent, Bundle)} for more details.
   1670      *
   1671      * @throws ActivityNotFoundException &nbsp;
   1672      *
   1673      * @see #startActivities(Intent[])
   1674      * @see PackageManager#resolveActivity
   1675      */
   1676     public abstract void startActivities(@RequiresPermission Intent[] intents, Bundle options);
   1677 
   1678     /**
   1679      * @hide
   1680      * Launch multiple new activities.  This is generally the same as calling
   1681      * {@link #startActivity(Intent)} for the first Intent in the array,
   1682      * that activity during its creation calling {@link #startActivity(Intent)}
   1683      * for the second entry, etc.  Note that unlike that approach, generally
   1684      * none of the activities except the last in the array will be created
   1685      * at this point, but rather will be created when the user first visits
   1686      * them (due to pressing back from the activity on top).
   1687      *
   1688      * <p>This method throws {@link ActivityNotFoundException}
   1689      * if there was no Activity found for <em>any</em> given Intent.  In this
   1690      * case the state of the activity stack is undefined (some Intents in the
   1691      * list may be on it, some not), so you probably want to avoid such situations.
   1692      *
   1693      * @param intents An array of Intents to be started.
   1694      * @param options Additional options for how the Activity should be started.
   1695      * @param userHandle The user for whom to launch the activities
   1696      * See {@link android.content.Context#startActivity(Intent, Bundle)
   1697      * Context.startActivity(Intent, Bundle)} for more details.
   1698      *
   1699      * @throws ActivityNotFoundException &nbsp;
   1700      *
   1701      * @see #startActivities(Intent[])
   1702      * @see PackageManager#resolveActivity
   1703      */
   1704     public void startActivitiesAsUser(Intent[] intents, Bundle options, UserHandle userHandle) {
   1705         throw new RuntimeException("Not implemented. Must override in a subclass.");
   1706     }
   1707 
   1708     /**
   1709      * Same as {@link #startIntentSender(IntentSender, Intent, int, int, int, Bundle)}
   1710      * with no options specified.
   1711      *
   1712      * @param intent The IntentSender to launch.
   1713      * @param fillInIntent If non-null, this will be provided as the
   1714      * intent parameter to {@link IntentSender#sendIntent}.
   1715      * @param flagsMask Intent flags in the original IntentSender that you
   1716      * would like to change.
   1717      * @param flagsValues Desired values for any bits set in
   1718      * <var>flagsMask</var>
   1719      * @param extraFlags Always set to 0.
   1720      *
   1721      * @see #startActivity(Intent)
   1722      * @see #startIntentSender(IntentSender, Intent, int, int, int, Bundle)
   1723      */
   1724     public abstract void startIntentSender(IntentSender intent,
   1725             Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
   1726             throws IntentSender.SendIntentException;
   1727 
   1728     /**
   1729      * Like {@link #startActivity(Intent, Bundle)}, but taking a IntentSender
   1730      * to start.  If the IntentSender is for an activity, that activity will be started
   1731      * as if you had called the regular {@link #startActivity(Intent)}
   1732      * here; otherwise, its associated action will be executed (such as
   1733      * sending a broadcast) as if you had called
   1734      * {@link IntentSender#sendIntent IntentSender.sendIntent} on it.
   1735      *
   1736      * @param intent The IntentSender to launch.
   1737      * @param fillInIntent If non-null, this will be provided as the
   1738      * intent parameter to {@link IntentSender#sendIntent}.
   1739      * @param flagsMask Intent flags in the original IntentSender that you
   1740      * would like to change.
   1741      * @param flagsValues Desired values for any bits set in
   1742      * <var>flagsMask</var>
   1743      * @param extraFlags Always set to 0.
   1744      * @param options Additional options for how the Activity should be started.
   1745      * See {@link android.content.Context#startActivity(Intent, Bundle)
   1746      * Context.startActivity(Intent, Bundle)} for more details.  If options
   1747      * have also been supplied by the IntentSender, options given here will
   1748      * override any that conflict with those given by the IntentSender.
   1749      *
   1750      * @see #startActivity(Intent, Bundle)
   1751      * @see #startIntentSender(IntentSender, Intent, int, int, int)
   1752      */
   1753     public abstract void startIntentSender(IntentSender intent,
   1754             @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
   1755             Bundle options) throws IntentSender.SendIntentException;
   1756 
   1757     /**
   1758      * Broadcast the given intent to all interested BroadcastReceivers.  This
   1759      * call is asynchronous; it returns immediately, and you will continue
   1760      * executing while the receivers are run.  No results are propagated from
   1761      * receivers and receivers can not abort the broadcast. If you want
   1762      * to allow receivers to propagate results or abort the broadcast, you must
   1763      * send an ordered broadcast using
   1764      * {@link #sendOrderedBroadcast(Intent, String)}.
   1765      *
   1766      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1767      *
   1768      * @param intent The Intent to broadcast; all receivers matching this
   1769      *               Intent will receive the broadcast.
   1770      *
   1771      * @see android.content.BroadcastReceiver
   1772      * @see #registerReceiver
   1773      * @see #sendBroadcast(Intent, String)
   1774      * @see #sendOrderedBroadcast(Intent, String)
   1775      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1776      */
   1777     public abstract void sendBroadcast(@RequiresPermission Intent intent);
   1778 
   1779     /**
   1780      * Broadcast the given intent to all interested BroadcastReceivers, allowing
   1781      * an optional required permission to be enforced.  This
   1782      * call is asynchronous; it returns immediately, and you will continue
   1783      * executing while the receivers are run.  No results are propagated from
   1784      * receivers and receivers can not abort the broadcast. If you want
   1785      * to allow receivers to propagate results or abort the broadcast, you must
   1786      * send an ordered broadcast using
   1787      * {@link #sendOrderedBroadcast(Intent, String)}.
   1788      *
   1789      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1790      *
   1791      * @param intent The Intent to broadcast; all receivers matching this
   1792      *               Intent will receive the broadcast.
   1793      * @param receiverPermission (optional) String naming a permission that
   1794      *               a receiver must hold in order to receive your broadcast.
   1795      *               If null, no permission is required.
   1796      *
   1797      * @see android.content.BroadcastReceiver
   1798      * @see #registerReceiver
   1799      * @see #sendBroadcast(Intent)
   1800      * @see #sendOrderedBroadcast(Intent, String)
   1801      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1802      */
   1803     public abstract void sendBroadcast(@RequiresPermission Intent intent,
   1804             @Nullable String receiverPermission);
   1805 
   1806 
   1807     /**
   1808      * Broadcast the given intent to all interested BroadcastReceivers, allowing
   1809      * an array of required permissions to be enforced.  This call is asynchronous; it returns
   1810      * immediately, and you will continue executing while the receivers are run.  No results are
   1811      * propagated from receivers and receivers can not abort the broadcast. If you want to allow
   1812      * receivers to propagate results or abort the broadcast, you must send an ordered broadcast
   1813      * using {@link #sendOrderedBroadcast(Intent, String)}.
   1814      *
   1815      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1816      *
   1817      * @param intent The Intent to broadcast; all receivers matching this
   1818      *               Intent will receive the broadcast.
   1819      * @param receiverPermissions Array of names of permissions that a receiver must hold
   1820      *                            in order to receive your broadcast.
   1821      *                            If null or empty, no permissions are required.
   1822      *
   1823      * @see android.content.BroadcastReceiver
   1824      * @see #registerReceiver
   1825      * @see #sendBroadcast(Intent)
   1826      * @see #sendOrderedBroadcast(Intent, String)
   1827      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1828      * @hide
   1829      */
   1830     public abstract void sendBroadcastMultiplePermissions(Intent intent,
   1831             String[] receiverPermissions);
   1832 
   1833     /**
   1834      * Broadcast the given intent to all interested BroadcastReceivers, allowing
   1835      * an optional required permission to be enforced.  This
   1836      * call is asynchronous; it returns immediately, and you will continue
   1837      * executing while the receivers are run.  No results are propagated from
   1838      * receivers and receivers can not abort the broadcast. If you want
   1839      * to allow receivers to propagate results or abort the broadcast, you must
   1840      * send an ordered broadcast using
   1841      * {@link #sendOrderedBroadcast(Intent, String)}.
   1842      *
   1843      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1844      *
   1845      * @param intent The Intent to broadcast; all receivers matching this
   1846      *               Intent will receive the broadcast.
   1847      * @param receiverPermission (optional) String naming a permission that
   1848      *               a receiver must hold in order to receive your broadcast.
   1849      *               If null, no permission is required.
   1850      * @param options (optional) Additional sending options, generated from a
   1851      * {@link android.app.BroadcastOptions}.
   1852      *
   1853      * @see android.content.BroadcastReceiver
   1854      * @see #registerReceiver
   1855      * @see #sendBroadcast(Intent)
   1856      * @see #sendOrderedBroadcast(Intent, String)
   1857      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1858      * @hide
   1859      */
   1860     @SystemApi
   1861     public abstract void sendBroadcast(Intent intent,
   1862             @Nullable String receiverPermission,
   1863             @Nullable Bundle options);
   1864 
   1865     /**
   1866      * Like {@link #sendBroadcast(Intent, String)}, but also allows specification
   1867      * of an associated app op as per {@link android.app.AppOpsManager}.
   1868      * @hide
   1869      */
   1870     public abstract void sendBroadcast(Intent intent,
   1871             String receiverPermission, int appOp);
   1872 
   1873     /**
   1874      * Broadcast the given intent to all interested BroadcastReceivers, delivering
   1875      * them one at a time to allow more preferred receivers to consume the
   1876      * broadcast before it is delivered to less preferred receivers.  This
   1877      * call is asynchronous; it returns immediately, and you will continue
   1878      * executing while the receivers are run.
   1879      *
   1880      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1881      *
   1882      * @param intent The Intent to broadcast; all receivers matching this
   1883      *               Intent will receive the broadcast.
   1884      * @param receiverPermission (optional) String naming a permissions that
   1885      *               a receiver must hold in order to receive your broadcast.
   1886      *               If null, no permission is required.
   1887      *
   1888      * @see android.content.BroadcastReceiver
   1889      * @see #registerReceiver
   1890      * @see #sendBroadcast(Intent)
   1891      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   1892      */
   1893     public abstract void sendOrderedBroadcast(@RequiresPermission Intent intent,
   1894             @Nullable String receiverPermission);
   1895 
   1896     /**
   1897      * Version of {@link #sendBroadcast(Intent)} that allows you to
   1898      * receive data back from the broadcast.  This is accomplished by
   1899      * supplying your own BroadcastReceiver when calling, which will be
   1900      * treated as a final receiver at the end of the broadcast -- its
   1901      * {@link BroadcastReceiver#onReceive} method will be called with
   1902      * the result values collected from the other receivers.  The broadcast will
   1903      * be serialized in the same way as calling
   1904      * {@link #sendOrderedBroadcast(Intent, String)}.
   1905      *
   1906      * <p>Like {@link #sendBroadcast(Intent)}, this method is
   1907      * asynchronous; it will return before
   1908      * resultReceiver.onReceive() is called.
   1909      *
   1910      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1911      *
   1912      * @param intent The Intent to broadcast; all receivers matching this
   1913      *               Intent will receive the broadcast.
   1914      * @param receiverPermission String naming a permissions that
   1915      *               a receiver must hold in order to receive your broadcast.
   1916      *               If null, no permission is required.
   1917      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   1918      *                       receiver of the broadcast.
   1919      * @param scheduler A custom Handler with which to schedule the
   1920      *                  resultReceiver callback; if null it will be
   1921      *                  scheduled in the Context's main thread.
   1922      * @param initialCode An initial value for the result code.  Often
   1923      *                    Activity.RESULT_OK.
   1924      * @param initialData An initial value for the result data.  Often
   1925      *                    null.
   1926      * @param initialExtras An initial value for the result extras.  Often
   1927      *                      null.
   1928      *
   1929      * @see #sendBroadcast(Intent)
   1930      * @see #sendBroadcast(Intent, String)
   1931      * @see #sendOrderedBroadcast(Intent, String)
   1932      * @see android.content.BroadcastReceiver
   1933      * @see #registerReceiver
   1934      * @see android.app.Activity#RESULT_OK
   1935      */
   1936     public abstract void sendOrderedBroadcast(@RequiresPermission @NonNull Intent intent,
   1937             @Nullable String receiverPermission, @Nullable BroadcastReceiver resultReceiver,
   1938             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   1939             @Nullable Bundle initialExtras);
   1940 
   1941     /**
   1942      * Version of {@link #sendBroadcast(Intent)} that allows you to
   1943      * receive data back from the broadcast.  This is accomplished by
   1944      * supplying your own BroadcastReceiver when calling, which will be
   1945      * treated as a final receiver at the end of the broadcast -- its
   1946      * {@link BroadcastReceiver#onReceive} method will be called with
   1947      * the result values collected from the other receivers.  The broadcast will
   1948      * be serialized in the same way as calling
   1949      * {@link #sendOrderedBroadcast(Intent, String)}.
   1950      *
   1951      * <p>Like {@link #sendBroadcast(Intent)}, this method is
   1952      * asynchronous; it will return before
   1953      * resultReceiver.onReceive() is called.
   1954      *
   1955      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   1956      *
   1957      *
   1958      * @param intent The Intent to broadcast; all receivers matching this
   1959      *               Intent will receive the broadcast.
   1960      * @param receiverPermission String naming a permissions that
   1961      *               a receiver must hold in order to receive your broadcast.
   1962      *               If null, no permission is required.
   1963      * @param options (optional) Additional sending options, generated from a
   1964      * {@link android.app.BroadcastOptions}.
   1965      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   1966      *                       receiver of the broadcast.
   1967      * @param scheduler A custom Handler with which to schedule the
   1968      *                  resultReceiver callback; if null it will be
   1969      *                  scheduled in the Context's main thread.
   1970      * @param initialCode An initial value for the result code.  Often
   1971      *                    Activity.RESULT_OK.
   1972      * @param initialData An initial value for the result data.  Often
   1973      *                    null.
   1974      * @param initialExtras An initial value for the result extras.  Often
   1975      *                      null.
   1976      * @see #sendBroadcast(Intent)
   1977      * @see #sendBroadcast(Intent, String)
   1978      * @see #sendOrderedBroadcast(Intent, String)
   1979      * @see android.content.BroadcastReceiver
   1980      * @see #registerReceiver
   1981      * @see android.app.Activity#RESULT_OK
   1982      * @hide
   1983      */
   1984     @SystemApi
   1985     public abstract void sendOrderedBroadcast(@NonNull Intent intent,
   1986             @Nullable String receiverPermission, @Nullable Bundle options,
   1987             @Nullable BroadcastReceiver resultReceiver, @Nullable Handler scheduler,
   1988             int initialCode, @Nullable String initialData, @Nullable Bundle initialExtras);
   1989 
   1990     /**
   1991      * Like {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler,
   1992      * int, String, android.os.Bundle)}, but also allows specification
   1993      * of an associated app op as per {@link android.app.AppOpsManager}.
   1994      * @hide
   1995      */
   1996     public abstract void sendOrderedBroadcast(Intent intent,
   1997             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
   1998             Handler scheduler, int initialCode, String initialData,
   1999             Bundle initialExtras);
   2000 
   2001     /**
   2002      * Version of {@link #sendBroadcast(Intent)} that allows you to specify the
   2003      * user the broadcast will be sent to.  This is not available to applications
   2004      * that are not pre-installed on the system image.  Using it requires holding
   2005      * the INTERACT_ACROSS_USERS permission.
   2006      * @param intent The intent to broadcast
   2007      * @param user UserHandle to send the intent to.
   2008      * @see #sendBroadcast(Intent)
   2009      */
   2010     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
   2011             UserHandle user);
   2012 
   2013     /**
   2014      * Version of {@link #sendBroadcast(Intent, String)} that allows you to specify the
   2015      * user the broadcast will be sent to.  This is not available to applications
   2016      * that are not pre-installed on the system image.  Using it requires holding
   2017      * the INTERACT_ACROSS_USERS permission.
   2018      *
   2019      * @param intent The Intent to broadcast; all receivers matching this
   2020      *               Intent will receive the broadcast.
   2021      * @param user UserHandle to send the intent to.
   2022      * @param receiverPermission (optional) String naming a permission that
   2023      *               a receiver must hold in order to receive your broadcast.
   2024      *               If null, no permission is required.
   2025      *
   2026      * @see #sendBroadcast(Intent, String)
   2027      */
   2028     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
   2029             UserHandle user, @Nullable String receiverPermission);
   2030 
   2031 
   2032     /**
   2033      * Version of {@link #sendBroadcast(Intent, String)} that allows you to specify the
   2034      * user the broadcast will be sent to.  This is not available to applications
   2035      * that are not pre-installed on the system image.  Using it requires holding
   2036      * the INTERACT_ACROSS_USERS permission.
   2037      *
   2038      * @param intent The Intent to broadcast; all receivers matching this
   2039      *               Intent will receive the broadcast.
   2040      * @param user UserHandle to send the intent to.
   2041      * @param receiverPermission (optional) String naming a permission that
   2042      *               a receiver must hold in order to receive your broadcast.
   2043      *               If null, no permission is required.
   2044      * @param appOp The app op associated with the broadcast.
   2045      *
   2046      * @see #sendBroadcast(Intent, String)
   2047      *
   2048      * @hide
   2049      */
   2050     public abstract void sendBroadcastAsUser(@RequiresPermission Intent intent,
   2051             UserHandle user, @Nullable String receiverPermission, int appOp);
   2052 
   2053     /**
   2054      * Version of
   2055      * {@link #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)}
   2056      * that allows you to specify the
   2057      * user the broadcast will be sent to.  This is not available to applications
   2058      * that are not pre-installed on the system image.  Using it requires holding
   2059      * the INTERACT_ACROSS_USERS permission.
   2060      *
   2061      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2062      *
   2063      * @param intent The Intent to broadcast; all receivers matching this
   2064      *               Intent will receive the broadcast.
   2065      * @param user UserHandle to send the intent to.
   2066      * @param receiverPermission String naming a permissions that
   2067      *               a receiver must hold in order to receive your broadcast.
   2068      *               If null, no permission is required.
   2069      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   2070      *                       receiver of the broadcast.
   2071      * @param scheduler A custom Handler with which to schedule the
   2072      *                  resultReceiver callback; if null it will be
   2073      *                  scheduled in the Context's main thread.
   2074      * @param initialCode An initial value for the result code.  Often
   2075      *                    Activity.RESULT_OK.
   2076      * @param initialData An initial value for the result data.  Often
   2077      *                    null.
   2078      * @param initialExtras An initial value for the result extras.  Often
   2079      *                      null.
   2080      *
   2081      * @see #sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
   2082      */
   2083     public abstract void sendOrderedBroadcastAsUser(@RequiresPermission Intent intent,
   2084             UserHandle user, @Nullable String receiverPermission, BroadcastReceiver resultReceiver,
   2085             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2086             @Nullable  Bundle initialExtras);
   2087 
   2088     /**
   2089      * Similar to above but takes an appOp as well, to enforce restrictions.
   2090      * @see #sendOrderedBroadcastAsUser(Intent, UserHandle, String,
   2091      *       BroadcastReceiver, Handler, int, String, Bundle)
   2092      * @hide
   2093      */
   2094     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
   2095             @Nullable String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
   2096             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2097             @Nullable  Bundle initialExtras);
   2098 
   2099     /**
   2100      * Similar to above but takes an appOp as well, to enforce restrictions, and an options Bundle.
   2101      * @see #sendOrderedBroadcastAsUser(Intent, UserHandle, String,
   2102      *       BroadcastReceiver, Handler, int, String, Bundle)
   2103      * @hide
   2104      */
   2105     public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
   2106             @Nullable String receiverPermission, int appOp, @Nullable Bundle options,
   2107             BroadcastReceiver resultReceiver, @Nullable Handler scheduler, int initialCode,
   2108             @Nullable String initialData, @Nullable  Bundle initialExtras);
   2109 
   2110     /**
   2111      * <p>Perform a {@link #sendBroadcast(Intent)} that is "sticky," meaning the
   2112      * Intent you are sending stays around after the broadcast is complete,
   2113      * so that others can quickly retrieve that data through the return
   2114      * value of {@link #registerReceiver(BroadcastReceiver, IntentFilter)}.  In
   2115      * all other ways, this behaves the same as
   2116      * {@link #sendBroadcast(Intent)}.
   2117      *
   2118      * <p>You must hold the {@link android.Manifest.permission#BROADCAST_STICKY}
   2119      * permission in order to use this API.  If you do not hold that
   2120      * permission, {@link SecurityException} will be thrown.
   2121      *
   2122      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2123      * can access them), no protection (anyone can modify them), and many other problems.
   2124      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2125      * has changed, with another mechanism for apps to retrieve the current value whenever
   2126      * desired.
   2127      *
   2128      * @param intent The Intent to broadcast; all receivers matching this
   2129      * Intent will receive the broadcast, and the Intent will be held to
   2130      * be re-broadcast to future receivers.
   2131      *
   2132      * @see #sendBroadcast(Intent)
   2133      * @see #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
   2134      */
   2135     @Deprecated
   2136     public abstract void sendStickyBroadcast(@RequiresPermission Intent intent);
   2137 
   2138     /**
   2139      * <p>Version of {@link #sendStickyBroadcast} that allows you to
   2140      * receive data back from the broadcast.  This is accomplished by
   2141      * supplying your own BroadcastReceiver when calling, which will be
   2142      * treated as a final receiver at the end of the broadcast -- its
   2143      * {@link BroadcastReceiver#onReceive} method will be called with
   2144      * the result values collected from the other receivers.  The broadcast will
   2145      * be serialized in the same way as calling
   2146      * {@link #sendOrderedBroadcast(Intent, String)}.
   2147      *
   2148      * <p>Like {@link #sendBroadcast(Intent)}, this method is
   2149      * asynchronous; it will return before
   2150      * resultReceiver.onReceive() is called.  Note that the sticky data
   2151      * stored is only the data you initially supply to the broadcast, not
   2152      * the result of any changes made by the receivers.
   2153      *
   2154      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2155      *
   2156      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2157      * can access them), no protection (anyone can modify them), and many other problems.
   2158      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2159      * has changed, with another mechanism for apps to retrieve the current value whenever
   2160      * desired.
   2161      *
   2162      * @param intent The Intent to broadcast; all receivers matching this
   2163      *               Intent will receive the broadcast.
   2164      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   2165      *                       receiver of the broadcast.
   2166      * @param scheduler A custom Handler with which to schedule the
   2167      *                  resultReceiver callback; if null it will be
   2168      *                  scheduled in the Context's main thread.
   2169      * @param initialCode An initial value for the result code.  Often
   2170      *                    Activity.RESULT_OK.
   2171      * @param initialData An initial value for the result data.  Often
   2172      *                    null.
   2173      * @param initialExtras An initial value for the result extras.  Often
   2174      *                      null.
   2175      *
   2176      * @see #sendBroadcast(Intent)
   2177      * @see #sendBroadcast(Intent, String)
   2178      * @see #sendOrderedBroadcast(Intent, String)
   2179      * @see #sendStickyBroadcast(Intent)
   2180      * @see android.content.BroadcastReceiver
   2181      * @see #registerReceiver
   2182      * @see android.app.Activity#RESULT_OK
   2183      */
   2184     @Deprecated
   2185     public abstract void sendStickyOrderedBroadcast(@RequiresPermission Intent intent,
   2186             BroadcastReceiver resultReceiver,
   2187             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2188             @Nullable Bundle initialExtras);
   2189 
   2190     /**
   2191      * <p>Remove the data previously sent with {@link #sendStickyBroadcast},
   2192      * so that it is as if the sticky broadcast had never happened.
   2193      *
   2194      * <p>You must hold the {@link android.Manifest.permission#BROADCAST_STICKY}
   2195      * permission in order to use this API.  If you do not hold that
   2196      * permission, {@link SecurityException} will be thrown.
   2197      *
   2198      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2199      * can access them), no protection (anyone can modify them), and many other problems.
   2200      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2201      * has changed, with another mechanism for apps to retrieve the current value whenever
   2202      * desired.
   2203      *
   2204      * @param intent The Intent that was previously broadcast.
   2205      *
   2206      * @see #sendStickyBroadcast
   2207      */
   2208     @Deprecated
   2209     public abstract void removeStickyBroadcast(@RequiresPermission Intent intent);
   2210 
   2211     /**
   2212      * <p>Version of {@link #sendStickyBroadcast(Intent)} that allows you to specify the
   2213      * user the broadcast will be sent to.  This is not available to applications
   2214      * that are not pre-installed on the system image.  Using it requires holding
   2215      * the INTERACT_ACROSS_USERS permission.
   2216      *
   2217      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2218      * can access them), no protection (anyone can modify them), and many other problems.
   2219      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2220      * has changed, with another mechanism for apps to retrieve the current value whenever
   2221      * desired.
   2222      *
   2223      * @param intent The Intent to broadcast; all receivers matching this
   2224      * Intent will receive the broadcast, and the Intent will be held to
   2225      * be re-broadcast to future receivers.
   2226      * @param user UserHandle to send the intent to.
   2227      *
   2228      * @see #sendBroadcast(Intent)
   2229      */
   2230     @Deprecated
   2231     public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent,
   2232             UserHandle user);
   2233 
   2234     /**
   2235      * @hide
   2236      * This is just here for sending CONNECTIVITY_ACTION.
   2237      */
   2238     @Deprecated
   2239     public abstract void sendStickyBroadcastAsUser(@RequiresPermission Intent intent,
   2240             UserHandle user, Bundle options);
   2241 
   2242     /**
   2243      * <p>Version of
   2244      * {@link #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)}
   2245      * that allows you to specify the
   2246      * user the broadcast will be sent to.  This is not available to applications
   2247      * that are not pre-installed on the system image.  Using it requires holding
   2248      * the INTERACT_ACROSS_USERS permission.
   2249      *
   2250      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2251      *
   2252      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2253      * can access them), no protection (anyone can modify them), and many other problems.
   2254      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2255      * has changed, with another mechanism for apps to retrieve the current value whenever
   2256      * desired.
   2257      *
   2258      * @param intent The Intent to broadcast; all receivers matching this
   2259      *               Intent will receive the broadcast.
   2260      * @param user UserHandle to send the intent to.
   2261      * @param resultReceiver Your own BroadcastReceiver to treat as the final
   2262      *                       receiver of the broadcast.
   2263      * @param scheduler A custom Handler with which to schedule the
   2264      *                  resultReceiver callback; if null it will be
   2265      *                  scheduled in the Context's main thread.
   2266      * @param initialCode An initial value for the result code.  Often
   2267      *                    Activity.RESULT_OK.
   2268      * @param initialData An initial value for the result data.  Often
   2269      *                    null.
   2270      * @param initialExtras An initial value for the result extras.  Often
   2271      *                      null.
   2272      *
   2273      * @see #sendStickyOrderedBroadcast(Intent, BroadcastReceiver, Handler, int, String, Bundle)
   2274      */
   2275     @Deprecated
   2276     public abstract void sendStickyOrderedBroadcastAsUser(@RequiresPermission Intent intent,
   2277             UserHandle user, BroadcastReceiver resultReceiver,
   2278             @Nullable Handler scheduler, int initialCode, @Nullable String initialData,
   2279             @Nullable Bundle initialExtras);
   2280 
   2281     /**
   2282      * <p>Version of {@link #removeStickyBroadcast(Intent)} that allows you to specify the
   2283      * user the broadcast will be sent to.  This is not available to applications
   2284      * that are not pre-installed on the system image.  Using it requires holding
   2285      * the INTERACT_ACROSS_USERS permission.
   2286      *
   2287      * <p>You must hold the {@link android.Manifest.permission#BROADCAST_STICKY}
   2288      * permission in order to use this API.  If you do not hold that
   2289      * permission, {@link SecurityException} will be thrown.
   2290      *
   2291      * @deprecated Sticky broadcasts should not be used.  They provide no security (anyone
   2292      * can access them), no protection (anyone can modify them), and many other problems.
   2293      * The recommended pattern is to use a non-sticky broadcast to report that <em>something</em>
   2294      * has changed, with another mechanism for apps to retrieve the current value whenever
   2295      * desired.
   2296      *
   2297      * @param intent The Intent that was previously broadcast.
   2298      * @param user UserHandle to remove the sticky broadcast from.
   2299      *
   2300      * @see #sendStickyBroadcastAsUser
   2301      */
   2302     @Deprecated
   2303     public abstract void removeStickyBroadcastAsUser(@RequiresPermission Intent intent,
   2304             UserHandle user);
   2305 
   2306     /**
   2307      * Register a BroadcastReceiver to be run in the main activity thread.  The
   2308      * <var>receiver</var> will be called with any broadcast Intent that
   2309      * matches <var>filter</var>, in the main application thread.
   2310      *
   2311      * <p>The system may broadcast Intents that are "sticky" -- these stay
   2312      * around after the broadcast as finished, to be sent to any later
   2313      * registrations. If your IntentFilter matches one of these sticky
   2314      * Intents, that Intent will be returned by this function
   2315      * <strong>and</strong> sent to your <var>receiver</var> as if it had just
   2316      * been broadcast.
   2317      *
   2318      * <p>There may be multiple sticky Intents that match <var>filter</var>,
   2319      * in which case each of these will be sent to <var>receiver</var>.  In
   2320      * this case, only one of these can be returned directly by the function;
   2321      * which of these that is returned is arbitrarily decided by the system.
   2322      *
   2323      * <p>If you know the Intent your are registering for is sticky, you can
   2324      * supply null for your <var>receiver</var>.  In this case, no receiver is
   2325      * registered -- the function simply returns the sticky Intent that
   2326      * matches <var>filter</var>.  In the case of multiple matches, the same
   2327      * rules as described above apply.
   2328      *
   2329      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2330      *
   2331      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
   2332      * registered with this method will correctly respect the
   2333      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
   2334      * Prior to that, it would be ignored and delivered to all matching registered
   2335      * receivers.  Be careful if using this for security.</p>
   2336      *
   2337      * <p class="note">Note: this method <em>cannot be called from a
   2338      * {@link BroadcastReceiver} component;</em> that is, from a BroadcastReceiver
   2339      * that is declared in an application's manifest.  It is okay, however, to call
   2340      * this method from another BroadcastReceiver that has itself been registered
   2341      * at run time with {@link #registerReceiver}, since the lifetime of such a
   2342      * registered BroadcastReceiver is tied to the object that registered it.</p>
   2343      *
   2344      * @param receiver The BroadcastReceiver to handle the broadcast.
   2345      * @param filter Selects the Intent broadcasts to be received.
   2346      *
   2347      * @return The first sticky intent found that matches <var>filter</var>,
   2348      *         or null if there are none.
   2349      *
   2350      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
   2351      * @see #sendBroadcast
   2352      * @see #unregisterReceiver
   2353      */
   2354     @Nullable
   2355     public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
   2356                                             IntentFilter filter);
   2357 
   2358     /**
   2359      * Register to receive intent broadcasts, to run in the context of
   2360      * <var>scheduler</var>.  See
   2361      * {@link #registerReceiver(BroadcastReceiver, IntentFilter)} for more
   2362      * information.  This allows you to enforce permissions on who can
   2363      * broadcast intents to your receiver, or have the receiver run in
   2364      * a different thread than the main application thread.
   2365      *
   2366      * <p>See {@link BroadcastReceiver} for more information on Intent broadcasts.
   2367      *
   2368      * <p>As of {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, receivers
   2369      * registered with this method will correctly respect the
   2370      * {@link Intent#setPackage(String)} specified for an Intent being broadcast.
   2371      * Prior to that, it would be ignored and delivered to all matching registered
   2372      * receivers.  Be careful if using this for security.</p>
   2373      *
   2374      * @param receiver The BroadcastReceiver to handle the broadcast.
   2375      * @param filter Selects the Intent broadcasts to be received.
   2376      * @param broadcastPermission String naming a permissions that a
   2377      *      broadcaster must hold in order to send an Intent to you.  If null,
   2378      *      no permission is required.
   2379      * @param scheduler Handler identifying the thread that will receive
   2380      *      the Intent.  If null, the main thread of the process will be used.
   2381      *
   2382      * @return The first sticky intent found that matches <var>filter</var>,
   2383      *         or null if there are none.
   2384      *
   2385      * @see #registerReceiver(BroadcastReceiver, IntentFilter)
   2386      * @see #sendBroadcast
   2387      * @see #unregisterReceiver
   2388      */
   2389     @Nullable
   2390     public abstract Intent registerReceiver(BroadcastReceiver receiver,
   2391             IntentFilter filter, @Nullable String broadcastPermission,
   2392             @Nullable Handler scheduler);
   2393 
   2394     /**
   2395      * @hide
   2396      * Same as {@link #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
   2397      * but for a specific user.  This receiver will receiver broadcasts that
   2398      * are sent to the requested user.  It
   2399      * requires holding the {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL}
   2400      * permission.
   2401      *
   2402      * @param receiver The BroadcastReceiver to handle the broadcast.
   2403      * @param user UserHandle to send the intent to.
   2404      * @param filter Selects the Intent broadcasts to be received.
   2405      * @param broadcastPermission String naming a permissions that a
   2406      *      broadcaster must hold in order to send an Intent to you.  If null,
   2407      *      no permission is required.
   2408      * @param scheduler Handler identifying the thread that will receive
   2409      *      the Intent.  If null, the main thread of the process will be used.
   2410      *
   2411      * @return The first sticky intent found that matches <var>filter</var>,
   2412      *         or null if there are none.
   2413      *
   2414      * @see #registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
   2415      * @see #sendBroadcast
   2416      * @see #unregisterReceiver
   2417      */
   2418     @Nullable
   2419     public abstract Intent registerReceiverAsUser(BroadcastReceiver receiver,
   2420             UserHandle user, IntentFilter filter, @Nullable String broadcastPermission,
   2421             @Nullable Handler scheduler);
   2422 
   2423     /**
   2424      * Unregister a previously registered BroadcastReceiver.  <em>All</em>
   2425      * filters that have been registered for this BroadcastReceiver will be
   2426      * removed.
   2427      *
   2428      * @param receiver The BroadcastReceiver to unregister.
   2429      *
   2430      * @see #registerReceiver
   2431      */
   2432     public abstract void unregisterReceiver(BroadcastReceiver receiver);
   2433 
   2434     /**
   2435      * Request that a given application service be started.  The Intent
   2436      * should contain either contain the complete class name of a specific service
   2437      * implementation to start or a specific package name to target.  If the
   2438      * Intent is less specified, it log a warning about this and which of the
   2439      * multiple matching services it finds and uses will be undefined.  If this service
   2440      * is not already running, it will be instantiated and started (creating a
   2441      * process for it if needed); if it is running then it remains running.
   2442      *
   2443      * <p>Every call to this method will result in a corresponding call to
   2444      * the target service's {@link android.app.Service#onStartCommand} method,
   2445      * with the <var>intent</var> given here.  This provides a convenient way
   2446      * to submit jobs to a service without having to bind and call on to its
   2447      * interface.
   2448      *
   2449      * <p>Using startService() overrides the default service lifetime that is
   2450      * managed by {@link #bindService}: it requires the service to remain
   2451      * running until {@link #stopService} is called, regardless of whether
   2452      * any clients are connected to it.  Note that calls to startService()
   2453      * are not nesting: no matter how many times you call startService(),
   2454      * a single call to {@link #stopService} will stop it.
   2455      *
   2456      * <p>The system attempts to keep running services around as much as
   2457      * possible.  The only time they should be stopped is if the current
   2458      * foreground application is using so many resources that the service needs
   2459      * to be killed.  If any errors happen in the service's process, it will
   2460      * automatically be restarted.
   2461      *
   2462      * <p>This function will throw {@link SecurityException} if you do not
   2463      * have permission to start the given service.
   2464      *
   2465      * <p class="note"><strong>Note:</strong> Each call to startService()
   2466      * results in significant work done by the system to manage service
   2467      * lifecycle surrounding the processing of the intent, which can take
   2468      * multiple milliseconds of CPU time. Due to this cost, startService()
   2469      * should not be used for frequent intent delivery to a service, and only
   2470      * for scheduling significant work. Use {@link #bindService bound services}
   2471      * for high frequency calls.
   2472      * </p>
   2473      *
   2474      * @param service Identifies the service to be started.  The Intent must be either
   2475      *      fully explicit (supplying a component name) or specify a specific package
   2476      *      name it is targetted to.  Additional values
   2477      *      may be included in the Intent extras to supply arguments along with
   2478      *      this specific start call.
   2479      *
   2480      * @return If the service is being started or is already running, the
   2481      * {@link ComponentName} of the actual service that was started is
   2482      * returned; else if the service does not exist null is returned.
   2483      *
   2484      * @throws SecurityException &nbsp;
   2485      *
   2486      * @see #stopService
   2487      * @see #bindService
   2488      */
   2489     @Nullable
   2490     public abstract ComponentName startService(Intent service);
   2491 
   2492     /**
   2493      * Request that a given application service be stopped.  If the service is
   2494      * not running, nothing happens.  Otherwise it is stopped.  Note that calls
   2495      * to startService() are not counted -- this stops the service no matter
   2496      * how many times it was started.
   2497      *
   2498      * <p>Note that if a stopped service still has {@link ServiceConnection}
   2499      * objects bound to it with the {@link #BIND_AUTO_CREATE} set, it will
   2500      * not be destroyed until all of these bindings are removed.  See
   2501      * the {@link android.app.Service} documentation for more details on a
   2502      * service's lifecycle.
   2503      *
   2504      * <p>This function will throw {@link SecurityException} if you do not
   2505      * have permission to stop the given service.
   2506      *
   2507      * @param service Description of the service to be stopped.  The Intent must be either
   2508      *      fully explicit (supplying a component name) or specify a specific package
   2509      *      name it is targetted to.
   2510      *
   2511      * @return If there is a service matching the given Intent that is already
   2512      * running, then it is stopped and {@code true} is returned; else {@code false} is returned.
   2513      *
   2514      * @throws SecurityException &nbsp;
   2515      *
   2516      * @see #startService
   2517      */
   2518     public abstract boolean stopService(Intent service);
   2519 
   2520     /**
   2521      * @hide like {@link #startService(Intent)} but for a specific user.
   2522      */
   2523     public abstract ComponentName startServiceAsUser(Intent service, UserHandle user);
   2524 
   2525     /**
   2526      * @hide like {@link #stopService(Intent)} but for a specific user.
   2527      */
   2528     public abstract boolean stopServiceAsUser(Intent service, UserHandle user);
   2529 
   2530     /**
   2531      * Connect to an application service, creating it if needed.  This defines
   2532      * a dependency between your application and the service.  The given
   2533      * <var>conn</var> will receive the service object when it is created and be
   2534      * told if it dies and restarts.  The service will be considered required
   2535      * by the system only for as long as the calling context exists.  For
   2536      * example, if this Context is an Activity that is stopped, the service will
   2537      * not be required to continue running until the Activity is resumed.
   2538      *
   2539      * <p>This function will throw {@link SecurityException} if you do not
   2540      * have permission to bind to the given service.
   2541      *
   2542      * <p class="note">Note: this method <em>can not be called from a
   2543      * {@link BroadcastReceiver} component</em>.  A pattern you can use to
   2544      * communicate from a BroadcastReceiver to a Service is to call
   2545      * {@link #startService} with the arguments containing the command to be
   2546      * sent, with the service calling its
   2547      * {@link android.app.Service#stopSelf(int)} method when done executing
   2548      * that command.  See the API demo App/Service/Service Start Arguments
   2549      * Controller for an illustration of this.  It is okay, however, to use
   2550      * this method from a BroadcastReceiver that has been registered with
   2551      * {@link #registerReceiver}, since the lifetime of this BroadcastReceiver
   2552      * is tied to another object (the one that registered it).</p>
   2553      *
   2554      * @param service Identifies the service to connect to.  The Intent may
   2555      *      specify either an explicit component name, or a logical
   2556      *      description (action, category, etc) to match an
   2557      *      {@link IntentFilter} published by a service.
   2558      * @param conn Receives information as the service is started and stopped.
   2559      *      This must be a valid ServiceConnection object; it must not be null.
   2560      * @param flags Operation options for the binding.  May be 0,
   2561      *          {@link #BIND_AUTO_CREATE}, {@link #BIND_DEBUG_UNBIND},
   2562      *          {@link #BIND_NOT_FOREGROUND}, {@link #BIND_ABOVE_CLIENT},
   2563      *          {@link #BIND_ALLOW_OOM_MANAGEMENT}, or
   2564      *          {@link #BIND_WAIVE_PRIORITY}.
   2565      * @return If you have successfully bound to the service, {@code true} is returned;
   2566      *         {@code false} is returned if the connection is not made so you will not
   2567      *         receive the service object.
   2568      *
   2569      * @throws SecurityException &nbsp;
   2570      *
   2571      * @see #unbindService
   2572      * @see #startService
   2573      * @see #BIND_AUTO_CREATE
   2574      * @see #BIND_DEBUG_UNBIND
   2575      * @see #BIND_NOT_FOREGROUND
   2576      */
   2577     public abstract boolean bindService(@RequiresPermission Intent service,
   2578             @NonNull ServiceConnection conn, @BindServiceFlags int flags);
   2579 
   2580     /**
   2581      * Same as {@link #bindService(Intent, ServiceConnection, int)}, but with an explicit userHandle
   2582      * argument for use by system server and other multi-user aware code.
   2583      * @hide
   2584      */
   2585     @SystemApi
   2586     @SuppressWarnings("unused")
   2587     public boolean bindServiceAsUser(@RequiresPermission Intent service, ServiceConnection conn,
   2588             int flags, UserHandle user) {
   2589         throw new RuntimeException("Not implemented. Must override in a subclass.");
   2590     }
   2591 
   2592     /**
   2593      * Same as {@link #bindService(Intent, ServiceConnection, int, UserHandle)}, but with an
   2594      * explicit non-null Handler to run the ServiceConnection callbacks on.
   2595      *
   2596      * @hide
   2597      */
   2598     public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags,
   2599             Handler handler, UserHandle user) {
   2600         throw new RuntimeException("Not implemented. Must override in a subclass.");
   2601     }
   2602 
   2603     /**
   2604      * Disconnect from an application service.  You will no longer receive
   2605      * calls as the service is restarted, and the service is now allowed to
   2606      * stop at any time.
   2607      *
   2608      * @param conn The connection interface previously supplied to
   2609      *             bindService().  This parameter must not be null.
   2610      *
   2611      * @see #bindService
   2612      */
   2613     public abstract void unbindService(@NonNull ServiceConnection conn);
   2614 
   2615     /**
   2616      * Start executing an {@link android.app.Instrumentation} class.  The given
   2617      * Instrumentation component will be run by killing its target application
   2618      * (if currently running), starting the target process, instantiating the
   2619      * instrumentation component, and then letting it drive the application.
   2620      *
   2621      * <p>This function is not synchronous -- it returns as soon as the
   2622      * instrumentation has started and while it is running.
   2623      *
   2624      * <p>Instrumentation is normally only allowed to run against a package
   2625      * that is either unsigned or signed with a signature that the
   2626      * the instrumentation package is also signed with (ensuring the target
   2627      * trusts the instrumentation).
   2628      *
   2629      * @param className Name of the Instrumentation component to be run.
   2630      * @param profileFile Optional path to write profiling data as the
   2631      * instrumentation runs, or null for no profiling.
   2632      * @param arguments Additional optional arguments to pass to the
   2633      * instrumentation, or null.
   2634      *
   2635      * @return {@code true} if the instrumentation was successfully started,
   2636      * else {@code false} if it could not be found.
   2637      */
   2638     public abstract boolean startInstrumentation(@NonNull ComponentName className,
   2639             @Nullable String profileFile, @Nullable Bundle arguments);
   2640 
   2641     /** @hide */
   2642     @StringDef({
   2643             POWER_SERVICE,
   2644             WINDOW_SERVICE,
   2645             LAYOUT_INFLATER_SERVICE,
   2646             ACCOUNT_SERVICE,
   2647             ACTIVITY_SERVICE,
   2648             ALARM_SERVICE,
   2649             NOTIFICATION_SERVICE,
   2650             ACCESSIBILITY_SERVICE,
   2651             CAPTIONING_SERVICE,
   2652             KEYGUARD_SERVICE,
   2653             LOCATION_SERVICE,
   2654             //@hide: COUNTRY_DETECTOR,
   2655             SEARCH_SERVICE,
   2656             SENSOR_SERVICE,
   2657             STORAGE_SERVICE,
   2658             WALLPAPER_SERVICE,
   2659             VIBRATOR_SERVICE,
   2660             //@hide: STATUS_BAR_SERVICE,
   2661             CONNECTIVITY_SERVICE,
   2662             //@hide: UPDATE_LOCK_SERVICE,
   2663             //@hide: NETWORKMANAGEMENT_SERVICE,
   2664             NETWORK_STATS_SERVICE,
   2665             //@hide: NETWORK_POLICY_SERVICE,
   2666             WIFI_SERVICE,
   2667             WIFI_NAN_SERVICE,
   2668             WIFI_P2P_SERVICE,
   2669             WIFI_SCANNING_SERVICE,
   2670             //@hide: WIFI_RTT_SERVICE,
   2671             //@hide: ETHERNET_SERVICE,
   2672             WIFI_RTT_SERVICE,
   2673             NSD_SERVICE,
   2674             AUDIO_SERVICE,
   2675             FINGERPRINT_SERVICE,
   2676             MEDIA_ROUTER_SERVICE,
   2677             TELEPHONY_SERVICE,
   2678             TELEPHONY_SUBSCRIPTION_SERVICE,
   2679             CARRIER_CONFIG_SERVICE,
   2680             TELECOM_SERVICE,
   2681             CLIPBOARD_SERVICE,
   2682             INPUT_METHOD_SERVICE,
   2683             TEXT_SERVICES_MANAGER_SERVICE,
   2684             APPWIDGET_SERVICE,
   2685             //@hide: VOICE_INTERACTION_MANAGER_SERVICE,
   2686             //@hide: BACKUP_SERVICE,
   2687             DROPBOX_SERVICE,
   2688             //@hide: DEVICE_IDLE_CONTROLLER,
   2689             DEVICE_POLICY_SERVICE,
   2690             UI_MODE_SERVICE,
   2691             DOWNLOAD_SERVICE,
   2692             NFC_SERVICE,
   2693             BLUETOOTH_SERVICE,
   2694             //@hide: SIP_SERVICE,
   2695             USB_SERVICE,
   2696             LAUNCHER_APPS_SERVICE,
   2697             //@hide: SERIAL_SERVICE,
   2698             //@hide: HDMI_CONTROL_SERVICE,
   2699             INPUT_SERVICE,
   2700             DISPLAY_SERVICE,
   2701             USER_SERVICE,
   2702             RESTRICTIONS_SERVICE,
   2703             APP_OPS_SERVICE,
   2704             CAMERA_SERVICE,
   2705             PRINT_SERVICE,
   2706             CONSUMER_IR_SERVICE,
   2707             //@hide: TRUST_SERVICE,
   2708             TV_INPUT_SERVICE,
   2709             //@hide: NETWORK_SCORE_SERVICE,
   2710             USAGE_STATS_SERVICE,
   2711             MEDIA_SESSION_SERVICE,
   2712             BATTERY_SERVICE,
   2713             JOB_SCHEDULER_SERVICE,
   2714             //@hide: PERSISTENT_DATA_BLOCK_SERVICE,
   2715             MEDIA_PROJECTION_SERVICE,
   2716             MIDI_SERVICE,
   2717             RADIO_SERVICE,
   2718             HARDWARE_PROPERTIES_SERVICE,
   2719             //@hide: SOUND_TRIGGER_SERVICE,
   2720             SHORTCUT_SERVICE,
   2721             //@hide: CONTEXTHUB_SERVICE,
   2722     })
   2723     @Retention(RetentionPolicy.SOURCE)
   2724     public @interface ServiceName {}
   2725 
   2726     /**
   2727      * Return the handle to a system-level service by name. The class of the
   2728      * returned object varies by the requested name. Currently available names
   2729      * are:
   2730      *
   2731      * <dl>
   2732      *  <dt> {@link #WINDOW_SERVICE} ("window")
   2733      *  <dd> The top-level window manager in which you can place custom
   2734      *  windows.  The returned object is a {@link android.view.WindowManager}.
   2735      *  <dt> {@link #LAYOUT_INFLATER_SERVICE} ("layout_inflater")
   2736      *  <dd> A {@link android.view.LayoutInflater} for inflating layout resources
   2737      *  in this context.
   2738      *  <dt> {@link #ACTIVITY_SERVICE} ("activity")
   2739      *  <dd> A {@link android.app.ActivityManager} for interacting with the
   2740      *  global activity state of the system.
   2741      *  <dt> {@link #POWER_SERVICE} ("power")
   2742      *  <dd> A {@link android.os.PowerManager} for controlling power
   2743      *  management.
   2744      *  <dt> {@link #ALARM_SERVICE} ("alarm")
   2745      *  <dd> A {@link android.app.AlarmManager} for receiving intents at the
   2746      *  time of your choosing.
   2747      *  <dt> {@link #NOTIFICATION_SERVICE} ("notification")
   2748      *  <dd> A {@link android.app.NotificationManager} for informing the user
   2749      *   of background events.
   2750      *  <dt> {@link #KEYGUARD_SERVICE} ("keyguard")
   2751      *  <dd> A {@link android.app.KeyguardManager} for controlling keyguard.
   2752      *  <dt> {@link #LOCATION_SERVICE} ("location")
   2753      *  <dd> A {@link android.location.LocationManager} for controlling location
   2754      *   (e.g., GPS) updates.
   2755      *  <dt> {@link #SEARCH_SERVICE} ("search")
   2756      *  <dd> A {@link android.app.SearchManager} for handling search.
   2757      *  <dt> {@link #VIBRATOR_SERVICE} ("vibrator")
   2758      *  <dd> A {@link android.os.Vibrator} for interacting with the vibrator
   2759      *  hardware.
   2760      *  <dt> {@link #CONNECTIVITY_SERVICE} ("connection")
   2761      *  <dd> A {@link android.net.ConnectivityManager ConnectivityManager} for
   2762      *  handling management of network connections.
   2763      *  <dt> {@link #WIFI_SERVICE} ("wifi")
   2764      *  <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of
   2765      * Wi-Fi connectivity.
   2766      *  <dt> {@link #WIFI_P2P_SERVICE} ("wifip2p")
   2767      *  <dd> A {@link android.net.wifi.p2p.WifiP2pManager WifiP2pManager} for management of
   2768      * Wi-Fi Direct connectivity.
   2769      * <dt> {@link #INPUT_METHOD_SERVICE} ("input_method")
   2770      * <dd> An {@link android.view.inputmethod.InputMethodManager InputMethodManager}
   2771      * for management of input methods.
   2772      * <dt> {@link #UI_MODE_SERVICE} ("uimode")
   2773      * <dd> An {@link android.app.UiModeManager} for controlling UI modes.
   2774      * <dt> {@link #DOWNLOAD_SERVICE} ("download")
   2775      * <dd> A {@link android.app.DownloadManager} for requesting HTTP downloads
   2776      * <dt> {@link #BATTERY_SERVICE} ("batterymanager")
   2777      * <dd> A {@link android.os.BatteryManager} for managing battery state
   2778      * <dt> {@link #JOB_SCHEDULER_SERVICE} ("taskmanager")
   2779      * <dd>  A {@link android.app.job.JobScheduler} for managing scheduled tasks
   2780      * <dt> {@link #NETWORK_STATS_SERVICE} ("netstats")
   2781      * <dd> A {@link android.app.usage.NetworkStatsManager NetworkStatsManager} for querying network
   2782      * usage statistics.
   2783      * <dt> {@link #HARDWARE_PROPERTIES_SERVICE} ("hardware_properties")
   2784      * <dd> A {@link android.os.HardwarePropertiesManager} for accessing hardware properties.
   2785      * </dl>
   2786      *
   2787      * <p>Note:  System services obtained via this API may be closely associated with
   2788      * the Context in which they are obtained from.  In general, do not share the
   2789      * service objects between various different contexts (Activities, Applications,
   2790      * Services, Providers, etc.)
   2791      *
   2792      * @param name The name of the desired service.
   2793      *
   2794      * @return The service or null if the name does not exist.
   2795      *
   2796      * @see #WINDOW_SERVICE
   2797      * @see android.view.WindowManager
   2798      * @see #LAYOUT_INFLATER_SERVICE
   2799      * @see android.view.LayoutInflater
   2800      * @see #ACTIVITY_SERVICE
   2801      * @see android.app.ActivityManager
   2802      * @see #POWER_SERVICE
   2803      * @see android.os.PowerManager
   2804      * @see #ALARM_SERVICE
   2805      * @see android.app.AlarmManager
   2806      * @see #NOTIFICATION_SERVICE
   2807      * @see android.app.NotificationManager
   2808      * @see #KEYGUARD_SERVICE
   2809      * @see android.app.KeyguardManager
   2810      * @see #LOCATION_SERVICE
   2811      * @see android.location.LocationManager
   2812      * @see #SEARCH_SERVICE
   2813      * @see android.app.SearchManager
   2814      * @see #SENSOR_SERVICE
   2815      * @see android.hardware.SensorManager
   2816      * @see #STORAGE_SERVICE
   2817      * @see android.os.storage.StorageManager
   2818      * @see #VIBRATOR_SERVICE
   2819      * @see android.os.Vibrator
   2820      * @see #CONNECTIVITY_SERVICE
   2821      * @see android.net.ConnectivityManager
   2822      * @see #WIFI_SERVICE
   2823      * @see android.net.wifi.WifiManager
   2824      * @see #AUDIO_SERVICE
   2825      * @see android.media.AudioManager
   2826      * @see #MEDIA_ROUTER_SERVICE
   2827      * @see android.media.MediaRouter
   2828      * @see #TELEPHONY_SERVICE
   2829      * @see android.telephony.TelephonyManager
   2830      * @see #TELEPHONY_SUBSCRIPTION_SERVICE
   2831      * @see android.telephony.SubscriptionManager
   2832      * @see #CARRIER_CONFIG_SERVICE
   2833      * @see android.telephony.CarrierConfigManager
   2834      * @see #INPUT_METHOD_SERVICE
   2835      * @see android.view.inputmethod.InputMethodManager
   2836      * @see #UI_MODE_SERVICE
   2837      * @see android.app.UiModeManager
   2838      * @see #DOWNLOAD_SERVICE
   2839      * @see android.app.DownloadManager
   2840      * @see #BATTERY_SERVICE
   2841      * @see android.os.BatteryManager
   2842      * @see #JOB_SCHEDULER_SERVICE
   2843      * @see android.app.job.JobScheduler
   2844      * @see #NETWORK_STATS_SERVICE
   2845      * @see android.app.usage.NetworkStatsManager
   2846      * @see android.os.HardwarePropertiesManager
   2847      * @see #HARDWARE_PROPERTIES_SERVICE
   2848      */
   2849     public abstract Object getSystemService(@ServiceName @NonNull String name);
   2850 
   2851     /**
   2852      * Return the handle to a system-level service by class.
   2853      * <p>
   2854      * Currently available classes are:
   2855      * {@link android.view.WindowManager}, {@link android.view.LayoutInflater},
   2856      * {@link android.app.ActivityManager}, {@link android.os.PowerManager},
   2857      * {@link android.app.AlarmManager}, {@link android.app.NotificationManager},
   2858      * {@link android.app.KeyguardManager}, {@link android.location.LocationManager},
   2859      * {@link android.app.SearchManager}, {@link android.os.Vibrator},
   2860      * {@link android.net.ConnectivityManager},
   2861      * {@link android.net.wifi.WifiManager},
   2862      * {@link android.media.AudioManager}, {@link android.media.MediaRouter},
   2863      * {@link android.telephony.TelephonyManager}, {@link android.telephony.SubscriptionManager},
   2864      * {@link android.view.inputmethod.InputMethodManager},
   2865      * {@link android.app.UiModeManager}, {@link android.app.DownloadManager},
   2866      * {@link android.os.BatteryManager}, {@link android.app.job.JobScheduler},
   2867      * {@link android.app.usage.NetworkStatsManager}.
   2868      * </p><p>
   2869      * Note: System services obtained via this API may be closely associated with
   2870      * the Context in which they are obtained from.  In general, do not share the
   2871      * service objects between various different contexts (Activities, Applications,
   2872      * Services, Providers, etc.)
   2873      * </p>
   2874      *
   2875      * @param serviceClass The class of the desired service.
   2876      * @return The service or null if the class is not a supported system service.
   2877      */
   2878     @SuppressWarnings("unchecked")
   2879     public final <T> T getSystemService(Class<T> serviceClass) {
   2880         // Because subclasses may override getSystemService(String) we cannot
   2881         // perform a lookup by class alone.  We must first map the class to its
   2882         // service name then invoke the string-based method.
   2883         String serviceName = getSystemServiceName(serviceClass);
   2884         return serviceName != null ? (T)getSystemService(serviceName) : null;
   2885     }
   2886 
   2887     /**
   2888      * Gets the name of the system-level service that is represented by the specified class.
   2889      *
   2890      * @param serviceClass The class of the desired service.
   2891      * @return The service name or null if the class is not a supported system service.
   2892      */
   2893     public abstract String getSystemServiceName(Class<?> serviceClass);
   2894 
   2895     /**
   2896      * Use with {@link #getSystemService} to retrieve a
   2897      * {@link android.os.PowerManager} for controlling power management,
   2898      * including "wake locks," which let you keep the device on while
   2899      * you're running long tasks.
   2900      */
   2901     public static final String POWER_SERVICE = "power";
   2902 
   2903     /**
   2904      * Use with {@link #getSystemService} to retrieve a
   2905      * {@link android.os.RecoverySystem} for accessing the recovery system
   2906      * service.
   2907      *
   2908      * @see #getSystemService
   2909      * @hide
   2910      */
   2911     public static final String RECOVERY_SERVICE = "recovery";
   2912 
   2913     /**
   2914      * Use with {@link #getSystemService} to retrieve a
   2915      * {@link android.view.WindowManager} for accessing the system's window
   2916      * manager.
   2917      *
   2918      * @see #getSystemService
   2919      * @see android.view.WindowManager
   2920      */
   2921     public static final String WINDOW_SERVICE = "window";
   2922 
   2923     /**
   2924      * Use with {@link #getSystemService} to retrieve a
   2925      * {@link android.view.LayoutInflater} for inflating layout resources in this
   2926      * context.
   2927      *
   2928      * @see #getSystemService
   2929      * @see android.view.LayoutInflater
   2930      */
   2931     public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
   2932 
   2933     /**
   2934      * Use with {@link #getSystemService} to retrieve a
   2935      * {@link android.accounts.AccountManager} for receiving intents at a
   2936      * time of your choosing.
   2937      *
   2938      * @see #getSystemService
   2939      * @see android.accounts.AccountManager
   2940      */
   2941     public static final String ACCOUNT_SERVICE = "account";
   2942 
   2943     /**
   2944      * Use with {@link #getSystemService} to retrieve a
   2945      * {@link android.app.ActivityManager} for interacting with the global
   2946      * system state.
   2947      *
   2948      * @see #getSystemService
   2949      * @see android.app.ActivityManager
   2950      */
   2951     public static final String ACTIVITY_SERVICE = "activity";
   2952 
   2953     /**
   2954      * Use with {@link #getSystemService} to retrieve a
   2955      * {@link android.app.AlarmManager} for receiving intents at a
   2956      * time of your choosing.
   2957      *
   2958      * @see #getSystemService
   2959      * @see android.app.AlarmManager
   2960      */
   2961     public static final String ALARM_SERVICE = "alarm";
   2962 
   2963     /**
   2964      * Use with {@link #getSystemService} to retrieve a
   2965      * {@link android.app.NotificationManager} for informing the user of
   2966      * background events.
   2967      *
   2968      * @see #getSystemService
   2969      * @see android.app.NotificationManager
   2970      */
   2971     public static final String NOTIFICATION_SERVICE = "notification";
   2972 
   2973     /**
   2974      * Use with {@link #getSystemService} to retrieve a
   2975      * {@link android.view.accessibility.AccessibilityManager} for giving the user
   2976      * feedback for UI events through the registered event listeners.
   2977      *
   2978      * @see #getSystemService
   2979      * @see android.view.accessibility.AccessibilityManager
   2980      */
   2981     public static final String ACCESSIBILITY_SERVICE = "accessibility";
   2982 
   2983     /**
   2984      * Use with {@link #getSystemService} to retrieve a
   2985      * {@link android.view.accessibility.CaptioningManager} for obtaining
   2986      * captioning properties and listening for changes in captioning
   2987      * preferences.
   2988      *
   2989      * @see #getSystemService
   2990      * @see android.view.accessibility.CaptioningManager
   2991      */
   2992     public static final String CAPTIONING_SERVICE = "captioning";
   2993 
   2994     /**
   2995      * Use with {@link #getSystemService} to retrieve a
   2996      * {@link android.app.NotificationManager} for controlling keyguard.
   2997      *
   2998      * @see #getSystemService
   2999      * @see android.app.KeyguardManager
   3000      */
   3001     public static final String KEYGUARD_SERVICE = "keyguard";
   3002 
   3003     /**
   3004      * Use with {@link #getSystemService} to retrieve a {@link
   3005      * android.location.LocationManager} for controlling location
   3006      * updates.
   3007      *
   3008      * @see #getSystemService
   3009      * @see android.location.LocationManager
   3010      */
   3011     public static final String LOCATION_SERVICE = "location";
   3012 
   3013     /**
   3014      * Use with {@link #getSystemService} to retrieve a
   3015      * {@link android.location.CountryDetector} for detecting the country that
   3016      * the user is in.
   3017      *
   3018      * @hide
   3019      */
   3020     public static final String COUNTRY_DETECTOR = "country_detector";
   3021 
   3022     /**
   3023      * Use with {@link #getSystemService} to retrieve a {@link
   3024      * android.app.SearchManager} for handling searches.
   3025      *
   3026      * @see #getSystemService
   3027      * @see android.app.SearchManager
   3028      */
   3029     public static final String SEARCH_SERVICE = "search";
   3030 
   3031     /**
   3032      * Use with {@link #getSystemService} to retrieve a {@link
   3033      * android.hardware.SensorManager} for accessing sensors.
   3034      *
   3035      * @see #getSystemService
   3036      * @see android.hardware.SensorManager
   3037      */
   3038     public static final String SENSOR_SERVICE = "sensor";
   3039 
   3040     /**
   3041      * Use with {@link #getSystemService} to retrieve a {@link
   3042      * android.os.storage.StorageManager} for accessing system storage
   3043      * functions.
   3044      *
   3045      * @see #getSystemService
   3046      * @see android.os.storage.StorageManager
   3047      */
   3048     public static final String STORAGE_SERVICE = "storage";
   3049 
   3050     /**
   3051      * Use with {@link #getSystemService} to retrieve a
   3052      * com.android.server.WallpaperService for accessing wallpapers.
   3053      *
   3054      * @see #getSystemService
   3055      */
   3056     public static final String WALLPAPER_SERVICE = "wallpaper";
   3057 
   3058     /**
   3059      * Use with {@link #getSystemService} to retrieve a {@link
   3060      * android.os.Vibrator} for interacting with the vibration hardware.
   3061      *
   3062      * @see #getSystemService
   3063      * @see android.os.Vibrator
   3064      */
   3065     public static final String VIBRATOR_SERVICE = "vibrator";
   3066 
   3067     /**
   3068      * Use with {@link #getSystemService} to retrieve a {@link
   3069      * android.app.StatusBarManager} for interacting with the status bar.
   3070      *
   3071      * @see #getSystemService
   3072      * @see android.app.StatusBarManager
   3073      * @hide
   3074      */
   3075     public static final String STATUS_BAR_SERVICE = "statusbar";
   3076 
   3077     /**
   3078      * Use with {@link #getSystemService} to retrieve a {@link
   3079      * android.net.ConnectivityManager} for handling management of
   3080      * network connections.
   3081      *
   3082      * @see #getSystemService
   3083      * @see android.net.ConnectivityManager
   3084      */
   3085     public static final String CONNECTIVITY_SERVICE = "connectivity";
   3086 
   3087     /**
   3088      * Use with {@link #getSystemService} to retrieve a {@link
   3089      * android.os.IUpdateLock} for managing runtime sequences that
   3090      * must not be interrupted by headless OTA application or similar.
   3091      *
   3092      * @hide
   3093      * @see #getSystemService
   3094      * @see android.os.UpdateLock
   3095      */
   3096     public static final String UPDATE_LOCK_SERVICE = "updatelock";
   3097 
   3098     /**
   3099      * Constant for the internal network management service, not really a Context service.
   3100      * @hide
   3101      */
   3102     public static final String NETWORKMANAGEMENT_SERVICE = "network_management";
   3103 
   3104     /**
   3105      * Use with {@link #getSystemService} to retrieve a {@link
   3106      * android.app.usage.NetworkStatsManager} for querying network usage stats.
   3107      *
   3108      * @see #getSystemService
   3109      * @see android.app.usage.NetworkStatsManager
   3110      */
   3111     public static final String NETWORK_STATS_SERVICE = "netstats";
   3112     /** {@hide} */
   3113     public static final String NETWORK_POLICY_SERVICE = "netpolicy";
   3114 
   3115     /**
   3116      * Use with {@link #getSystemService} to retrieve a {@link
   3117      * android.net.wifi.WifiManager} for handling management of
   3118      * Wi-Fi access.
   3119      *
   3120      * @see #getSystemService
   3121      * @see android.net.wifi.WifiManager
   3122      */
   3123     public static final String WIFI_SERVICE = "wifi";
   3124 
   3125     /**
   3126      * Use with {@link #getSystemService} to retrieve a {@link
   3127      * android.net.wifi.p2p.WifiP2pManager} for handling management of
   3128      * Wi-Fi peer-to-peer connections.
   3129      *
   3130      * @see #getSystemService
   3131      * @see android.net.wifi.p2p.WifiP2pManager
   3132      */
   3133     public static final String WIFI_P2P_SERVICE = "wifip2p";
   3134 
   3135     /**
   3136      * Use with {@link #getSystemService} to retrieve a
   3137      * {@link android.net.wifi.nan.WifiNanManager} for handling management of
   3138      * Wi-Fi NAN discovery and connections.
   3139      *
   3140      * @see #getSystemService
   3141      * @see android.net.wifi.nan.WifiNanManager
   3142      * @hide PROPOSED_NAN_API
   3143      */
   3144     public static final String WIFI_NAN_SERVICE = "wifinan";
   3145 
   3146     /**
   3147      * Use with {@link #getSystemService} to retrieve a {@link
   3148      * android.net.wifi.WifiScanner} for scanning the wifi universe
   3149      *
   3150      * @see #getSystemService
   3151      * @see android.net.wifi.WifiScanner
   3152      * @hide
   3153      */
   3154     @SystemApi
   3155     public static final String WIFI_SCANNING_SERVICE = "wifiscanner";
   3156 
   3157     /**
   3158      * Use with {@link #getSystemService} to retrieve a {@link
   3159      * android.net.wifi.RttManager} for ranging devices with wifi
   3160      *
   3161      * @see #getSystemService
   3162      * @see android.net.wifi.RttManager
   3163      * @hide
   3164      */
   3165     @SystemApi
   3166     public static final String WIFI_RTT_SERVICE = "rttmanager";
   3167 
   3168     /**
   3169      * Use with {@link #getSystemService} to retrieve a {@link
   3170      * android.net.EthernetManager} for handling management of
   3171      * Ethernet access.
   3172      *
   3173      * @see #getSystemService
   3174      * @see android.net.EthernetManager
   3175      *
   3176      * @hide
   3177      */
   3178     public static final String ETHERNET_SERVICE = "ethernet";
   3179 
   3180     /**
   3181      * Use with {@link #getSystemService} to retrieve a {@link
   3182      * android.net.nsd.NsdManager} for handling management of network service
   3183      * discovery
   3184      *
   3185      * @see #getSystemService
   3186      * @see android.net.nsd.NsdManager
   3187      */
   3188     public static final String NSD_SERVICE = "servicediscovery";
   3189 
   3190     /**
   3191      * Use with {@link #getSystemService} to retrieve a
   3192      * {@link android.media.AudioManager} for handling management of volume,
   3193      * ringer modes and audio routing.
   3194      *
   3195      * @see #getSystemService
   3196      * @see android.media.AudioManager
   3197      */
   3198     public static final String AUDIO_SERVICE = "audio";
   3199 
   3200     /**
   3201      * Use with {@link #getSystemService} to retrieve a
   3202      * {@link android.hardware.fingerprint.FingerprintManager} for handling management
   3203      * of fingerprints.
   3204      *
   3205      * @see #getSystemService
   3206      * @see android.hardware.fingerprint.FingerprintManager
   3207      */
   3208     public static final String FINGERPRINT_SERVICE = "fingerprint";
   3209 
   3210     /**
   3211      * Use with {@link #getSystemService} to retrieve a
   3212      * {@link android.media.MediaRouter} for controlling and managing
   3213      * routing of media.
   3214      *
   3215      * @see #getSystemService
   3216      * @see android.media.MediaRouter
   3217      */
   3218     public static final String MEDIA_ROUTER_SERVICE = "media_router";
   3219 
   3220     /**
   3221      * Use with {@link #getSystemService} to retrieve a
   3222      * {@link android.media.session.MediaSessionManager} for managing media Sessions.
   3223      *
   3224      * @see #getSystemService
   3225      * @see android.media.session.MediaSessionManager
   3226      */
   3227     public static final String MEDIA_SESSION_SERVICE = "media_session";
   3228 
   3229     /**
   3230      * Use with {@link #getSystemService} to retrieve a
   3231      * {@link android.telephony.TelephonyManager} for handling management the
   3232      * telephony features of the device.
   3233      *
   3234      * @see #getSystemService
   3235      * @see android.telephony.TelephonyManager
   3236      */
   3237     public static final String TELEPHONY_SERVICE = "phone";
   3238 
   3239     /**
   3240      * Use with {@link #getSystemService} to retrieve a
   3241      * {@link android.telephony.SubscriptionManager} for handling management the
   3242      * telephony subscriptions of the device.
   3243      *
   3244      * @see #getSystemService
   3245      * @see android.telephony.SubscriptionManager
   3246      */
   3247     public static final String TELEPHONY_SUBSCRIPTION_SERVICE = "telephony_subscription_service";
   3248 
   3249     /**
   3250      * Use with {@link #getSystemService} to retrieve a
   3251      * {@link android.telecom.TelecomManager} to manage telecom-related features
   3252      * of the device.
   3253      *
   3254      * @see #getSystemService
   3255      * @see android.telecom.TelecomManager
   3256      */
   3257     public static final String TELECOM_SERVICE = "telecom";
   3258 
   3259     /**
   3260      * Use with {@link #getSystemService} to retrieve a
   3261      * {@link android.telephony.CarrierConfigManager} for reading carrier configuration values.
   3262      *
   3263      * @see #getSystemService
   3264      * @see android.telephony.CarrierConfigManager
   3265      */
   3266     public static final String CARRIER_CONFIG_SERVICE = "carrier_config";
   3267 
   3268     /**
   3269      * Use with {@link #getSystemService} to retrieve a
   3270      * {@link android.text.ClipboardManager} for accessing and modifying
   3271      * {@link android.content.ClipboardManager} for accessing and modifying
   3272      * the contents of the global clipboard.
   3273      *
   3274      * @see #getSystemService
   3275      * @see android.content.ClipboardManager
   3276      */
   3277     public static final String CLIPBOARD_SERVICE = "clipboard";
   3278 
   3279     /**
   3280      * Use with {@link #getSystemService} to retrieve a
   3281      * {@link android.view.inputmethod.InputMethodManager} for accessing input
   3282      * methods.
   3283      *
   3284      * @see #getSystemService
   3285      */
   3286     public static final String INPUT_METHOD_SERVICE = "input_method";
   3287 
   3288     /**
   3289      * Use with {@link #getSystemService} to retrieve a
   3290      * {@link android.view.textservice.TextServicesManager} for accessing
   3291      * text services.
   3292      *
   3293      * @see #getSystemService
   3294      */
   3295     public static final String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
   3296 
   3297     /**
   3298      * Use with {@link #getSystemService} to retrieve a
   3299      * {@link android.appwidget.AppWidgetManager} for accessing AppWidgets.
   3300      *
   3301      * @see #getSystemService
   3302      */
   3303     public static final String APPWIDGET_SERVICE = "appwidget";
   3304 
   3305     /**
   3306      * Official published name of the (internal) voice interaction manager service.
   3307      *
   3308      * @hide
   3309      * @see #getSystemService
   3310      */
   3311     public static final String VOICE_INTERACTION_MANAGER_SERVICE = "voiceinteraction";
   3312 
   3313     /**
   3314      * Use with {@link #getSystemService} to access the
   3315      * {@link com.android.server.voiceinteraction.SoundTriggerService}.
   3316      *
   3317      * @hide
   3318      * @see #getSystemService
   3319      */
   3320     public static final String SOUND_TRIGGER_SERVICE = "soundtrigger";
   3321 
   3322 
   3323     /**
   3324      * Use with {@link #getSystemService} to retrieve an
   3325      * {@link android.app.backup.IBackupManager IBackupManager} for communicating
   3326      * with the backup mechanism.
   3327      * @hide
   3328      *
   3329      * @see #getSystemService
   3330      */
   3331     @SystemApi
   3332     public static final String BACKUP_SERVICE = "backup";
   3333 
   3334     /**
   3335      * Use with {@link #getSystemService} to retrieve a
   3336      * {@link android.os.DropBoxManager} instance for recording
   3337      * diagnostic logs.
   3338      * @see #getSystemService
   3339      */
   3340     public static final String DROPBOX_SERVICE = "dropbox";
   3341 
   3342     /**
   3343      * System service name for the DeviceIdleController.  There is no Java API for this.
   3344      * @see #getSystemService
   3345      * @hide
   3346      */
   3347     public static final String DEVICE_IDLE_CONTROLLER = "deviceidle";
   3348 
   3349     /**
   3350      * Use with {@link #getSystemService} to retrieve a
   3351      * {@link android.app.admin.DevicePolicyManager} for working with global
   3352      * device policy management.
   3353      *
   3354      * @see #getSystemService
   3355      */
   3356     public static final String DEVICE_POLICY_SERVICE = "device_policy";
   3357 
   3358     /**
   3359      * Use with {@link #getSystemService} to retrieve a
   3360      * {@link android.app.UiModeManager} for controlling UI modes.
   3361      *
   3362      * @see #getSystemService
   3363      */
   3364     public static final String UI_MODE_SERVICE = "uimode";
   3365 
   3366     /**
   3367      * Use with {@link #getSystemService} to retrieve a
   3368      * {@link android.app.DownloadManager} for requesting HTTP downloads.
   3369      *
   3370      * @see #getSystemService
   3371      */
   3372     public static final String DOWNLOAD_SERVICE = "download";
   3373 
   3374     /**
   3375      * Use with {@link #getSystemService} to retrieve a
   3376      * {@link android.os.BatteryManager} for managing battery state.
   3377      *
   3378      * @see #getSystemService
   3379      */
   3380     public static final String BATTERY_SERVICE = "batterymanager";
   3381 
   3382     /**
   3383      * Use with {@link #getSystemService} to retrieve a
   3384      * {@link android.nfc.NfcManager} for using NFC.
   3385      *
   3386      * @see #getSystemService
   3387      */
   3388     public static final String NFC_SERVICE = "nfc";
   3389 
   3390     /**
   3391      * Use with {@link #getSystemService} to retrieve a
   3392      * {@link android.bluetooth.BluetoothManager} for using Bluetooth.
   3393      *
   3394      * @see #getSystemService
   3395      */
   3396     public static final String BLUETOOTH_SERVICE = "bluetooth";
   3397 
   3398     /**
   3399      * Use with {@link #getSystemService} to retrieve a
   3400      * {@link android.net.sip.SipManager} for accessing the SIP related service.
   3401      *
   3402      * @see #getSystemService
   3403      */
   3404     /** @hide */
   3405     public static final String SIP_SERVICE = "sip";
   3406 
   3407     /**
   3408      * Use with {@link #getSystemService} to retrieve a {@link
   3409      * android.hardware.usb.UsbManager} for access to USB devices (as a USB host)
   3410      * and for controlling this device's behavior as a USB device.
   3411      *
   3412      * @see #getSystemService
   3413      * @see android.hardware.usb.UsbManager
   3414      */
   3415     public static final String USB_SERVICE = "usb";
   3416 
   3417     /**
   3418      * Use with {@link #getSystemService} to retrieve a {@link
   3419      * android.hardware.SerialManager} for access to serial ports.
   3420      *
   3421      * @see #getSystemService
   3422      * @see android.hardware.SerialManager
   3423      *
   3424      * @hide
   3425      */
   3426     public static final String SERIAL_SERVICE = "serial";
   3427 
   3428     /**
   3429      * Use with {@link #getSystemService} to retrieve a
   3430      * {@link android.hardware.hdmi.HdmiControlManager} for controlling and managing
   3431      * HDMI-CEC protocol.
   3432      *
   3433      * @see #getSystemService
   3434      * @see android.hardware.hdmi.HdmiControlManager
   3435      * @hide
   3436      */
   3437     @SystemApi
   3438     public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
   3439 
   3440     /**
   3441      * Use with {@link #getSystemService} to retrieve a
   3442      * {@link android.hardware.input.InputManager} for interacting with input devices.
   3443      *
   3444      * @see #getSystemService
   3445      * @see android.hardware.input.InputManager
   3446      */
   3447     public static final String INPUT_SERVICE = "input";
   3448 
   3449     /**
   3450      * Use with {@link #getSystemService} to retrieve a
   3451      * {@link android.hardware.display.DisplayManager} for interacting with display devices.
   3452      *
   3453      * @see #getSystemService
   3454      * @see android.hardware.display.DisplayManager
   3455      */
   3456     public static final String DISPLAY_SERVICE = "display";
   3457 
   3458     /**
   3459      * Use with {@link #getSystemService} to retrieve a
   3460      * {@link android.os.UserManager} for managing users on devices that support multiple users.
   3461      *
   3462      * @see #getSystemService
   3463      * @see android.os.UserManager
   3464      */
   3465     public static final String USER_SERVICE = "user";
   3466 
   3467     /**
   3468      * Use with {@link #getSystemService} to retrieve a
   3469      * {@link android.content.pm.LauncherApps} for querying and monitoring launchable apps across
   3470      * profiles of a user.
   3471      *
   3472      * @see #getSystemService
   3473      * @see android.content.pm.LauncherApps
   3474      */
   3475     public static final String LAUNCHER_APPS_SERVICE = "launcherapps";
   3476 
   3477     /**
   3478      * Use with {@link #getSystemService} to retrieve a
   3479      * {@link android.content.RestrictionsManager} for retrieving application restrictions
   3480      * and requesting permissions for restricted operations.
   3481      * @see #getSystemService
   3482      * @see android.content.RestrictionsManager
   3483      */
   3484     public static final String RESTRICTIONS_SERVICE = "restrictions";
   3485 
   3486     /**
   3487      * Use with {@link #getSystemService} to retrieve a
   3488      * {@link android.app.AppOpsManager} for tracking application operations
   3489      * on the device.
   3490      *
   3491      * @see #getSystemService
   3492      * @see android.app.AppOpsManager
   3493      */
   3494     public static final String APP_OPS_SERVICE = "appops";
   3495 
   3496     /**
   3497      * Use with {@link #getSystemService} to retrieve a
   3498      * {@link android.hardware.camera2.CameraManager} for interacting with
   3499      * camera devices.
   3500      *
   3501      * @see #getSystemService
   3502      * @see android.hardware.camera2.CameraManager
   3503      */
   3504     public static final String CAMERA_SERVICE = "camera";
   3505 
   3506     /**
   3507      * {@link android.print.PrintManager} for printing and managing
   3508      * printers and print tasks.
   3509      *
   3510      * @see #getSystemService
   3511      * @see android.print.PrintManager
   3512      */
   3513     public static final String PRINT_SERVICE = "print";
   3514 
   3515     /**
   3516      * Use with {@link #getSystemService} to retrieve a
   3517      * {@link android.hardware.ConsumerIrManager} for transmitting infrared
   3518      * signals from the device.
   3519      *
   3520      * @see #getSystemService
   3521      * @see android.hardware.ConsumerIrManager
   3522      */
   3523     public static final String CONSUMER_IR_SERVICE = "consumer_ir";
   3524 
   3525     /**
   3526      * {@link android.app.trust.TrustManager} for managing trust agents.
   3527      * @see #getSystemService
   3528      * @see android.app.trust.TrustManager
   3529      * @hide
   3530      */
   3531     public static final String TRUST_SERVICE = "trust";
   3532 
   3533     /**
   3534      * Use with {@link #getSystemService} to retrieve a
   3535      * {@link android.media.tv.TvInputManager} for interacting with TV inputs
   3536      * on the device.
   3537      *
   3538      * @see #getSystemService
   3539      * @see android.media.tv.TvInputManager
   3540      */
   3541     public static final String TV_INPUT_SERVICE = "tv_input";
   3542 
   3543     /**
   3544      * {@link android.net.NetworkScoreManager} for managing network scoring.
   3545      * @see #getSystemService
   3546      * @see android.net.NetworkScoreManager
   3547      * @hide
   3548      */
   3549     @SystemApi
   3550     public static final String NETWORK_SCORE_SERVICE = "network_score";
   3551 
   3552     /**
   3553      * Use with {@link #getSystemService} to retrieve a {@link
   3554      * android.app.usage.UsageStatsManager} for querying device usage stats.
   3555      *
   3556      * @see #getSystemService
   3557      * @see android.app.usage.UsageStatsManager
   3558      */
   3559     public static final String USAGE_STATS_SERVICE = "usagestats";
   3560 
   3561     /**
   3562      * Use with {@link #getSystemService} to retrieve a {@link
   3563      * android.app.job.JobScheduler} instance for managing occasional
   3564      * background tasks.
   3565      * @see #getSystemService
   3566      * @see android.app.job.JobScheduler
   3567      */
   3568     public static final String JOB_SCHEDULER_SERVICE = "jobscheduler";
   3569 
   3570     /**
   3571      * Use with {@link #getSystemService} to retrieve a {@link
   3572      * android.service.persistentdata.PersistentDataBlockManager} instance
   3573      * for interacting with a storage device that lives across factory resets.
   3574      *
   3575      * @see #getSystemService
   3576      * @see android.service.persistentdata.PersistentDataBlockManager
   3577      * @hide
   3578      */
   3579     @SystemApi
   3580     public static final String PERSISTENT_DATA_BLOCK_SERVICE = "persistent_data_block";
   3581 
   3582     /**
   3583      * Use with {@link #getSystemService} to retrieve a {@link
   3584      * android.media.projection.MediaProjectionManager} instance for managing
   3585      * media projection sessions.
   3586      * @see #getSystemService
   3587      * @see android.media.projection.MediaProjectionManager
   3588      */
   3589     public static final String MEDIA_PROJECTION_SERVICE = "media_projection";
   3590 
   3591     /**
   3592      * Use with {@link #getSystemService} to retrieve a
   3593      * {@link android.media.midi.MidiManager} for accessing the MIDI service.
   3594      *
   3595      * @see #getSystemService
   3596      */
   3597     public static final String MIDI_SERVICE = "midi";
   3598 
   3599 
   3600     /**
   3601      * Use with {@link #getSystemService} to retrieve a
   3602      * {@link android.hardware.radio.RadioManager} for accessing the broadcast radio service.
   3603      *
   3604      * @see #getSystemService
   3605      * @hide
   3606      */
   3607     public static final String RADIO_SERVICE = "radio";
   3608 
   3609     /**
   3610      * Use with {@link #getSystemService} to retrieve a
   3611      * {@link android.os.HardwarePropertiesManager} for accessing the hardware properties service.
   3612      *
   3613      * @see #getSystemService
   3614      */
   3615     public static final String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
   3616 
   3617     /**
   3618      * Use with {@link #getSystemService} to retrieve a
   3619      * {@link android.content.pm.ShortcutManager} for accessing the launcher shortcut service.
   3620      *
   3621      * @see #getSystemService
   3622      * @see android.content.pm.ShortcutManager
   3623      */
   3624     public static final String SHORTCUT_SERVICE = "shortcut";
   3625 
   3626     /**
   3627      * Use with {@link #getSystemService} to retrieve a {@link
   3628      * android.hardware.location.ContextHubManager} for accessing context hubs.
   3629      *
   3630      * @see #getSystemService
   3631      * @see android.hardware.location.ContextHubManager
   3632      *
   3633      * @hide
   3634      */
   3635     @SystemApi
   3636     public static final String CONTEXTHUB_SERVICE = "contexthub";
   3637 
   3638     /**
   3639      * Use with {@link #getSystemService} to retrieve a
   3640      * {@link android.os.health.SystemHealthManager} for accessing system health (battery, power,
   3641      * memory, etc) metrics.
   3642      *
   3643      * @see #getSystemService
   3644      */
   3645     public static final String SYSTEM_HEALTH_SERVICE = "systemhealth";
   3646 
   3647     /**
   3648      * Gatekeeper Service.
   3649      * @hide
   3650      */
   3651     public static final String GATEKEEPER_SERVICE = "android.service.gatekeeper.IGateKeeperService";
   3652 
   3653     /**
   3654      * Determine whether the given permission is allowed for a particular
   3655      * process and user ID running in the system.
   3656      *
   3657      * @param permission The name of the permission being checked.
   3658      * @param pid The process ID being checked against.  Must be > 0.
   3659      * @param uid The user ID being checked against.  A uid of 0 is the root
   3660      * user, which will pass every permission check.
   3661      *
   3662      * @return {@link PackageManager#PERMISSION_GRANTED} if the given
   3663      * pid/uid is allowed that permission, or
   3664      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3665      *
   3666      * @see PackageManager#checkPermission(String, String)
   3667      * @see #checkCallingPermission
   3668      */
   3669     @CheckResult(suggest="#enforcePermission(String,int,int,String)")
   3670     @PackageManager.PermissionResult
   3671     public abstract int checkPermission(@NonNull String permission, int pid, int uid);
   3672 
   3673     /** @hide */
   3674     @PackageManager.PermissionResult
   3675     public abstract int checkPermission(@NonNull String permission, int pid, int uid,
   3676             IBinder callerToken);
   3677 
   3678     /**
   3679      * Determine whether the calling process of an IPC you are handling has been
   3680      * granted a particular permission.  This is basically the same as calling
   3681      * {@link #checkPermission(String, int, int)} with the pid and uid returned
   3682      * by {@link android.os.Binder#getCallingPid} and
   3683      * {@link android.os.Binder#getCallingUid}.  One important difference
   3684      * is that if you are not currently processing an IPC, this function
   3685      * will always fail.  This is done to protect against accidentally
   3686      * leaking permissions; you can use {@link #checkCallingOrSelfPermission}
   3687      * to avoid this protection.
   3688      *
   3689      * @param permission The name of the permission being checked.
   3690      *
   3691      * @return {@link PackageManager#PERMISSION_GRANTED} if the calling
   3692      * pid/uid is allowed that permission, or
   3693      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3694      *
   3695      * @see PackageManager#checkPermission(String, String)
   3696      * @see #checkPermission
   3697      * @see #checkCallingOrSelfPermission
   3698      */
   3699     @CheckResult(suggest="#enforceCallingPermission(String,String)")
   3700     @PackageManager.PermissionResult
   3701     public abstract int checkCallingPermission(@NonNull String permission);
   3702 
   3703     /**
   3704      * Determine whether the calling process of an IPC <em>or you</em> have been
   3705      * granted a particular permission.  This is the same as
   3706      * {@link #checkCallingPermission}, except it grants your own permissions
   3707      * if you are not currently processing an IPC.  Use with care!
   3708      *
   3709      * @param permission The name of the permission being checked.
   3710      *
   3711      * @return {@link PackageManager#PERMISSION_GRANTED} if the calling
   3712      * pid/uid is allowed that permission, or
   3713      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3714      *
   3715      * @see PackageManager#checkPermission(String, String)
   3716      * @see #checkPermission
   3717      * @see #checkCallingPermission
   3718      */
   3719     @CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)")
   3720     @PackageManager.PermissionResult
   3721     public abstract int checkCallingOrSelfPermission(@NonNull String permission);
   3722 
   3723     /**
   3724      * Determine whether <em>you</em> have been granted a particular permission.
   3725      *
   3726      * @param permission The name of the permission being checked.
   3727      *
   3728      * @return {@link PackageManager#PERMISSION_GRANTED} if you have the
   3729      * permission, or {@link PackageManager#PERMISSION_DENIED} if not.
   3730      *
   3731      * @see PackageManager#checkPermission(String, String)
   3732      * @see #checkCallingPermission(String)
   3733      */
   3734     @PackageManager.PermissionResult
   3735     public abstract int checkSelfPermission(@NonNull String permission);
   3736 
   3737     /**
   3738      * If the given permission is not allowed for a particular process
   3739      * and user ID running in the system, throw a {@link SecurityException}.
   3740      *
   3741      * @param permission The name of the permission being checked.
   3742      * @param pid The process ID being checked against.  Must be &gt; 0.
   3743      * @param uid The user ID being checked against.  A uid of 0 is the root
   3744      * user, which will pass every permission check.
   3745      * @param message A message to include in the exception if it is thrown.
   3746      *
   3747      * @see #checkPermission(String, int, int)
   3748      */
   3749     public abstract void enforcePermission(
   3750             @NonNull String permission, int pid, int uid, @Nullable String message);
   3751 
   3752     /**
   3753      * If the calling process of an IPC you are handling has not been
   3754      * granted a particular permission, throw a {@link
   3755      * SecurityException}.  This is basically the same as calling
   3756      * {@link #enforcePermission(String, int, int, String)} with the
   3757      * pid and uid returned by {@link android.os.Binder#getCallingPid}
   3758      * and {@link android.os.Binder#getCallingUid}.  One important
   3759      * difference is that if you are not currently processing an IPC,
   3760      * this function will always throw the SecurityException.  This is
   3761      * done to protect against accidentally leaking permissions; you
   3762      * can use {@link #enforceCallingOrSelfPermission} to avoid this
   3763      * protection.
   3764      *
   3765      * @param permission The name of the permission being checked.
   3766      * @param message A message to include in the exception if it is thrown.
   3767      *
   3768      * @see #checkCallingPermission(String)
   3769      */
   3770     public abstract void enforceCallingPermission(
   3771             @NonNull String permission, @Nullable String message);
   3772 
   3773     /**
   3774      * If neither you nor the calling process of an IPC you are
   3775      * handling has been granted a particular permission, throw a
   3776      * {@link SecurityException}.  This is the same as {@link
   3777      * #enforceCallingPermission}, except it grants your own
   3778      * permissions if you are not currently processing an IPC.  Use
   3779      * with care!
   3780      *
   3781      * @param permission The name of the permission being checked.
   3782      * @param message A message to include in the exception if it is thrown.
   3783      *
   3784      * @see #checkCallingOrSelfPermission(String)
   3785      */
   3786     public abstract void enforceCallingOrSelfPermission(
   3787             @NonNull String permission, @Nullable String message);
   3788 
   3789     /**
   3790      * Grant permission to access a specific Uri to another package, regardless
   3791      * of whether that package has general permission to access the Uri's
   3792      * content provider.  This can be used to grant specific, temporary
   3793      * permissions, typically in response to user interaction (such as the
   3794      * user opening an attachment that you would like someone else to
   3795      * display).
   3796      *
   3797      * <p>Normally you should use {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
   3798      * Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3799      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
   3800      * Intent.FLAG_GRANT_WRITE_URI_PERMISSION} with the Intent being used to
   3801      * start an activity instead of this function directly.  If you use this
   3802      * function directly, you should be sure to call
   3803      * {@link #revokeUriPermission} when the target should no longer be allowed
   3804      * to access it.
   3805      *
   3806      * <p>To succeed, the content provider owning the Uri must have set the
   3807      * {@link android.R.styleable#AndroidManifestProvider_grantUriPermissions
   3808      * grantUriPermissions} attribute in its manifest or included the
   3809      * {@link android.R.styleable#AndroidManifestGrantUriPermission
   3810      * &lt;grant-uri-permissions&gt;} tag.
   3811      *
   3812      * @param toPackage The package you would like to allow to access the Uri.
   3813      * @param uri The Uri you would like to grant access to.
   3814      * @param modeFlags The desired access modes.  Any combination of
   3815      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
   3816      * Intent.FLAG_GRANT_READ_URI_PERMISSION},
   3817      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
   3818      * Intent.FLAG_GRANT_WRITE_URI_PERMISSION},
   3819      * {@link Intent#FLAG_GRANT_PERSISTABLE_URI_PERMISSION
   3820      * Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION}, or
   3821      * {@link Intent#FLAG_GRANT_PREFIX_URI_PERMISSION
   3822      * Intent.FLAG_GRANT_PREFIX_URI_PERMISSION}.
   3823      *
   3824      * @see #revokeUriPermission
   3825      */
   3826     public abstract void grantUriPermission(String toPackage, Uri uri,
   3827             @Intent.GrantUriMode int modeFlags);
   3828 
   3829     /**
   3830      * Remove all permissions to access a particular content provider Uri
   3831      * that were previously added with {@link #grantUriPermission}.  The given
   3832      * Uri will match all previously granted Uris that are the same or a
   3833      * sub-path of the given Uri.  That is, revoking "content://foo/target" will
   3834      * revoke both "content://foo/target" and "content://foo/target/sub", but not
   3835      * "content://foo".  It will not remove any prefix grants that exist at a
   3836      * higher level.
   3837      *
   3838      * <p>Prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}, if you did not have
   3839      * regular permission access to a Uri, but had received access to it through
   3840      * a specific Uri permission grant, you could not revoke that grant with this
   3841      * function and a {@link SecurityException} would be thrown.  As of
   3842      * {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this function will not throw a security exception,
   3843      * but will remove whatever permission grants to the Uri had been given to the app
   3844      * (or none).</p>
   3845      *
   3846      * @param uri The Uri you would like to revoke access to.
   3847      * @param modeFlags The desired access modes.  Any combination of
   3848      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION
   3849      * Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3850      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION
   3851      * Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   3852      *
   3853      * @see #grantUriPermission
   3854      */
   3855     public abstract void revokeUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags);
   3856 
   3857     /**
   3858      * Determine whether a particular process and user ID has been granted
   3859      * permission to access a specific URI.  This only checks for permissions
   3860      * that have been explicitly granted -- if the given process/uid has
   3861      * more general access to the URI's content provider then this check will
   3862      * always fail.
   3863      *
   3864      * @param uri The uri that is being checked.
   3865      * @param pid The process ID being checked against.  Must be &gt; 0.
   3866      * @param uid The user ID being checked against.  A uid of 0 is the root
   3867      * user, which will pass every permission check.
   3868      * @param modeFlags The type of access to grant.  May be one or both of
   3869      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3870      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   3871      *
   3872      * @return {@link PackageManager#PERMISSION_GRANTED} if the given
   3873      * pid/uid is allowed to access that uri, or
   3874      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3875      *
   3876      * @see #checkCallingUriPermission
   3877      */
   3878     @CheckResult(suggest="#enforceUriPermission(Uri,int,int,String)")
   3879     public abstract int checkUriPermission(Uri uri, int pid, int uid,
   3880             @Intent.AccessUriMode int modeFlags);
   3881 
   3882     /** @hide */
   3883     public abstract int checkUriPermission(Uri uri, int pid, int uid,
   3884             @Intent.AccessUriMode int modeFlags, IBinder callerToken);
   3885 
   3886     /**
   3887      * Determine whether the calling process and user ID has been
   3888      * granted permission to access a specific URI.  This is basically
   3889      * the same as calling {@link #checkUriPermission(Uri, int, int,
   3890      * int)} with the pid and uid returned by {@link
   3891      * android.os.Binder#getCallingPid} and {@link
   3892      * android.os.Binder#getCallingUid}.  One important difference is
   3893      * that if you are not currently processing an IPC, this function
   3894      * will always fail.
   3895      *
   3896      * @param uri The uri that is being checked.
   3897      * @param modeFlags The type of access to grant.  May be one or both of
   3898      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3899      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   3900      *
   3901      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
   3902      * is allowed to access that uri, or
   3903      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3904      *
   3905      * @see #checkUriPermission(Uri, int, int, int)
   3906      */
   3907     @CheckResult(suggest="#enforceCallingUriPermission(Uri,int,String)")
   3908     public abstract int checkCallingUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags);
   3909 
   3910     /**
   3911      * Determine whether the calling process of an IPC <em>or you</em> has been granted
   3912      * permission to access a specific URI.  This is the same as
   3913      * {@link #checkCallingUriPermission}, except it grants your own permissions
   3914      * if you are not currently processing an IPC.  Use with care!
   3915      *
   3916      * @param uri The uri that is being checked.
   3917      * @param modeFlags The type of access to grant.  May be one or both of
   3918      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3919      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   3920      *
   3921      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
   3922      * is allowed to access that uri, or
   3923      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3924      *
   3925      * @see #checkCallingUriPermission
   3926      */
   3927     @CheckResult(suggest="#enforceCallingOrSelfUriPermission(Uri,int,String)")
   3928     public abstract int checkCallingOrSelfUriPermission(Uri uri,
   3929             @Intent.AccessUriMode int modeFlags);
   3930 
   3931     /**
   3932      * Check both a Uri and normal permission.  This allows you to perform
   3933      * both {@link #checkPermission} and {@link #checkUriPermission} in one
   3934      * call.
   3935      *
   3936      * @param uri The Uri whose permission is to be checked, or null to not
   3937      * do this check.
   3938      * @param readPermission The permission that provides overall read access,
   3939      * or null to not do this check.
   3940      * @param writePermission The permission that provides overall write
   3941      * access, or null to not do this check.
   3942      * @param pid The process ID being checked against.  Must be &gt; 0.
   3943      * @param uid The user ID being checked against.  A uid of 0 is the root
   3944      * user, which will pass every permission check.
   3945      * @param modeFlags The type of access to grant.  May be one or both of
   3946      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3947      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   3948      *
   3949      * @return {@link PackageManager#PERMISSION_GRANTED} if the caller
   3950      * is allowed to access that uri or holds one of the given permissions, or
   3951      * {@link PackageManager#PERMISSION_DENIED} if it is not.
   3952      */
   3953     @CheckResult(suggest="#enforceUriPermission(Uri,String,String,int,int,int,String)")
   3954     public abstract int checkUriPermission(@Nullable Uri uri, @Nullable String readPermission,
   3955             @Nullable String writePermission, int pid, int uid,
   3956             @Intent.AccessUriMode int modeFlags);
   3957 
   3958     /**
   3959      * If a particular process and user ID has not been granted
   3960      * permission to access a specific URI, throw {@link
   3961      * SecurityException}.  This only checks for permissions that have
   3962      * been explicitly granted -- if the given process/uid has more
   3963      * general access to the URI's content provider then this check
   3964      * will always fail.
   3965      *
   3966      * @param uri The uri that is being checked.
   3967      * @param pid The process ID being checked against.  Must be &gt; 0.
   3968      * @param uid The user ID being checked against.  A uid of 0 is the root
   3969      * user, which will pass every permission check.
   3970      * @param modeFlags The type of access to grant.  May be one or both of
   3971      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3972      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   3973      * @param message A message to include in the exception if it is thrown.
   3974      *
   3975      * @see #checkUriPermission(Uri, int, int, int)
   3976      */
   3977     public abstract void enforceUriPermission(
   3978             Uri uri, int pid, int uid, @Intent.AccessUriMode int modeFlags, String message);
   3979 
   3980     /**
   3981      * If the calling process and user ID has not been granted
   3982      * permission to access a specific URI, throw {@link
   3983      * SecurityException}.  This is basically the same as calling
   3984      * {@link #enforceUriPermission(Uri, int, int, int, String)} with
   3985      * the pid and uid returned by {@link
   3986      * android.os.Binder#getCallingPid} and {@link
   3987      * android.os.Binder#getCallingUid}.  One important difference is
   3988      * that if you are not currently processing an IPC, this function
   3989      * will always throw a SecurityException.
   3990      *
   3991      * @param uri The uri that is being checked.
   3992      * @param modeFlags The type of access to grant.  May be one or both of
   3993      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   3994      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   3995      * @param message A message to include in the exception if it is thrown.
   3996      *
   3997      * @see #checkCallingUriPermission(Uri, int)
   3998      */
   3999     public abstract void enforceCallingUriPermission(
   4000             Uri uri, @Intent.AccessUriMode int modeFlags, String message);
   4001 
   4002     /**
   4003      * If the calling process of an IPC <em>or you</em> has not been
   4004      * granted permission to access a specific URI, throw {@link
   4005      * SecurityException}.  This is the same as {@link
   4006      * #enforceCallingUriPermission}, except it grants your own
   4007      * permissions if you are not currently processing an IPC.  Use
   4008      * with care!
   4009      *
   4010      * @param uri The uri that is being checked.
   4011      * @param modeFlags The type of access to grant.  May be one or both of
   4012      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   4013      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   4014      * @param message A message to include in the exception if it is thrown.
   4015      *
   4016      * @see #checkCallingOrSelfUriPermission(Uri, int)
   4017      */
   4018     public abstract void enforceCallingOrSelfUriPermission(
   4019             Uri uri, @Intent.AccessUriMode int modeFlags, String message);
   4020 
   4021     /**
   4022      * Enforce both a Uri and normal permission.  This allows you to perform
   4023      * both {@link #enforcePermission} and {@link #enforceUriPermission} in one
   4024      * call.
   4025      *
   4026      * @param uri The Uri whose permission is to be checked, or null to not
   4027      * do this check.
   4028      * @param readPermission The permission that provides overall read access,
   4029      * or null to not do this check.
   4030      * @param writePermission The permission that provides overall write
   4031      * access, or null to not do this check.
   4032      * @param pid The process ID being checked against.  Must be &gt; 0.
   4033      * @param uid The user ID being checked against.  A uid of 0 is the root
   4034      * user, which will pass every permission check.
   4035      * @param modeFlags The type of access to grant.  May be one or both of
   4036      * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION} or
   4037      * {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION}.
   4038      * @param message A message to include in the exception if it is thrown.
   4039      *
   4040      * @see #checkUriPermission(Uri, String, String, int, int, int)
   4041      */
   4042     public abstract void enforceUriPermission(
   4043             @Nullable Uri uri, @Nullable String readPermission,
   4044             @Nullable String writePermission, int pid, int uid, @Intent.AccessUriMode int modeFlags,
   4045             @Nullable String message);
   4046 
   4047     /** @hide */
   4048     @IntDef(flag = true,
   4049             value = {CONTEXT_INCLUDE_CODE, CONTEXT_IGNORE_SECURITY, CONTEXT_RESTRICTED})
   4050     @Retention(RetentionPolicy.SOURCE)
   4051     public @interface CreatePackageOptions {}
   4052 
   4053     /**
   4054      * Flag for use with {@link #createPackageContext}: include the application
   4055      * code with the context.  This means loading code into the caller's
   4056      * process, so that {@link #getClassLoader()} can be used to instantiate
   4057      * the application's classes.  Setting this flags imposes security
   4058      * restrictions on what application context you can access; if the
   4059      * requested application can not be safely loaded into your process,
   4060      * java.lang.SecurityException will be thrown.  If this flag is not set,
   4061      * there will be no restrictions on the packages that can be loaded,
   4062      * but {@link #getClassLoader} will always return the default system
   4063      * class loader.
   4064      */
   4065     public static final int CONTEXT_INCLUDE_CODE = 0x00000001;
   4066 
   4067     /**
   4068      * Flag for use with {@link #createPackageContext}: ignore any security
   4069      * restrictions on the Context being requested, allowing it to always
   4070      * be loaded.  For use with {@link #CONTEXT_INCLUDE_CODE} to allow code
   4071      * to be loaded into a process even when it isn't safe to do so.  Use
   4072      * with extreme care!
   4073      */
   4074     public static final int CONTEXT_IGNORE_SECURITY = 0x00000002;
   4075 
   4076     /**
   4077      * Flag for use with {@link #createPackageContext}: a restricted context may
   4078      * disable specific features. For instance, a View associated with a restricted
   4079      * context would ignore particular XML attributes.
   4080      */
   4081     public static final int CONTEXT_RESTRICTED = 0x00000004;
   4082 
   4083     /**
   4084      * Flag for use with {@link #createPackageContext}: point all file APIs at
   4085      * device-protected storage.
   4086      *
   4087      * @hide
   4088      */
   4089     public static final int CONTEXT_DEVICE_PROTECTED_STORAGE = 0x00000008;
   4090 
   4091     /**
   4092      * Flag for use with {@link #createPackageContext}: point all file APIs at
   4093      * credential-protected storage.
   4094      *
   4095      * @hide
   4096      */
   4097     public static final int CONTEXT_CREDENTIAL_PROTECTED_STORAGE = 0x00000010;
   4098 
   4099     /**
   4100      * @hide Used to indicate we should tell the activity manager about the process
   4101      * loading this code.
   4102      */
   4103     public static final int CONTEXT_REGISTER_PACKAGE = 0x40000000;
   4104 
   4105     /**
   4106      * Return a new Context object for the given application name.  This
   4107      * Context is the same as what the named application gets when it is
   4108      * launched, containing the same resources and class loader.  Each call to
   4109      * this method returns a new instance of a Context object; Context objects
   4110      * are not shared, however they share common state (Resources, ClassLoader,
   4111      * etc) so the Context instance itself is fairly lightweight.
   4112      *
   4113      * <p>Throws {@link android.content.pm.PackageManager.NameNotFoundException} if there is no
   4114      * application with the given package name.
   4115      *
   4116      * <p>Throws {@link java.lang.SecurityException} if the Context requested
   4117      * can not be loaded into the caller's process for security reasons (see
   4118      * {@link #CONTEXT_INCLUDE_CODE} for more information}.
   4119      *
   4120      * @param packageName Name of the application's package.
   4121      * @param flags Option flags, one of {@link #CONTEXT_INCLUDE_CODE}
   4122      *              or {@link #CONTEXT_IGNORE_SECURITY}.
   4123      *
   4124      * @return A {@link Context} for the application.
   4125      *
   4126      * @throws SecurityException &nbsp;
   4127      * @throws PackageManager.NameNotFoundException if there is no application with
   4128      * the given package name.
   4129      */
   4130     public abstract Context createPackageContext(String packageName,
   4131             @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException;
   4132 
   4133     /**
   4134      * Similar to {@link #createPackageContext(String, int)}, but with a
   4135      * different {@link UserHandle}. For example, {@link #getContentResolver()}
   4136      * will open any {@link Uri} as the given user.
   4137      *
   4138      * @hide
   4139      */
   4140     public abstract Context createPackageContextAsUser(
   4141             String packageName, int flags, UserHandle user)
   4142             throws PackageManager.NameNotFoundException;
   4143 
   4144     /**
   4145      * Creates a context given an {@link android.content.pm.ApplicationInfo}.
   4146      *
   4147      * @hide
   4148      */
   4149     public abstract Context createApplicationContext(ApplicationInfo application,
   4150             int flags) throws PackageManager.NameNotFoundException;
   4151 
   4152     /**
   4153      * Get the userId associated with this context
   4154      * @return user id
   4155      *
   4156      * @hide
   4157      */
   4158     @TestApi
   4159     public abstract @UserIdInt int getUserId();
   4160 
   4161     /**
   4162      * Return a new Context object for the current Context but whose resources
   4163      * are adjusted to match the given Configuration.  Each call to this method
   4164      * returns a new instance of a Context object; Context objects are not
   4165      * shared, however common state (ClassLoader, other Resources for the
   4166      * same configuration) may be so the Context itself can be fairly lightweight.
   4167      *
   4168      * @param overrideConfiguration A {@link Configuration} specifying what
   4169      * values to modify in the base Configuration of the original Context's
   4170      * resources.  If the base configuration changes (such as due to an
   4171      * orientation change), the resources of this context will also change except
   4172      * for those that have been explicitly overridden with a value here.
   4173      *
   4174      * @return A {@link Context} with the given configuration override.
   4175      */
   4176     public abstract Context createConfigurationContext(
   4177             @NonNull Configuration overrideConfiguration);
   4178 
   4179     /**
   4180      * Return a new Context object for the current Context but whose resources
   4181      * are adjusted to match the metrics of the given Display.  Each call to this method
   4182      * returns a new instance of a Context object; Context objects are not
   4183      * shared, however common state (ClassLoader, other Resources for the
   4184      * same configuration) may be so the Context itself can be fairly lightweight.
   4185      *
   4186      * The returned display Context provides a {@link WindowManager}
   4187      * (see {@link #getSystemService(String)}) that is configured to show windows
   4188      * on the given display.  The WindowManager's {@link WindowManager#getDefaultDisplay}
   4189      * method can be used to retrieve the Display from the returned Context.
   4190      *
   4191      * @param display A {@link Display} object specifying the display
   4192      * for whose metrics the Context's resources should be tailored and upon which
   4193      * new windows should be shown.
   4194      *
   4195      * @return A {@link Context} for the display.
   4196      */
   4197     public abstract Context createDisplayContext(@NonNull Display display);
   4198 
   4199     /**
   4200      * Return a new Context object for the current Context but whose storage
   4201      * APIs are backed by device-protected storage.
   4202      * <p>
   4203      * On devices with direct boot, data stored in this location is encrypted
   4204      * with a key tied to the physical device, and it can be accessed
   4205      * immediately after the device has booted successfully, both
   4206      * <em>before and after</em> the user has authenticated with their
   4207      * credentials (such as a lock pattern or PIN).
   4208      * <p>
   4209      * Because device-protected data is available without user authentication,
   4210      * you should carefully limit the data you store using this Context. For
   4211      * example, storing sensitive authentication tokens or passwords in the
   4212      * device-protected area is strongly discouraged.
   4213      * <p>
   4214      * If the underlying device does not have the ability to store
   4215      * device-protected and credential-protected data using different keys, then
   4216      * both storage areas will become available at the same time. They remain as
   4217      * two distinct storage locations on disk, and only the window of
   4218      * availability changes.
   4219      * <p>
   4220      * Each call to this method returns a new instance of a Context object;
   4221      * Context objects are not shared, however common state (ClassLoader, other
   4222      * Resources for the same configuration) may be so the Context itself can be
   4223      * fairly lightweight.
   4224      *
   4225      * @see #isDeviceProtectedStorage()
   4226      */
   4227     public abstract Context createDeviceProtectedStorageContext();
   4228 
   4229     /** @removed */
   4230     @Deprecated
   4231     public Context createDeviceEncryptedStorageContext() {
   4232         return createDeviceProtectedStorageContext();
   4233     }
   4234 
   4235     /**
   4236      * Return a new Context object for the current Context but whose storage
   4237      * APIs are backed by credential-protected storage. This is the default
   4238      * storage area for apps unless
   4239      * {@link android.R.attr#defaultToDeviceProtectedStorage} was requested.
   4240      * <p>
   4241      * On devices with direct boot, data stored in this location is encrypted
   4242      * with a key tied to user credentials, which can be accessed
   4243      * <em>only after</em> the user has entered their credentials (such as a
   4244      * lock pattern or PIN).
   4245      * <p>
   4246      * If the underlying device does not have the ability to store
   4247      * device-protected and credential-protected data using different keys, then
   4248      * both storage areas will become available at the same time. They remain as
   4249      * two distinct storage locations on disk, and only the window of
   4250      * availability changes.
   4251      * <p>
   4252      * Each call to this method returns a new instance of a Context object;
   4253      * Context objects are not shared, however common state (ClassLoader, other
   4254      * Resources for the same configuration) may be so the Context itself can be
   4255      * fairly lightweight.
   4256      *
   4257      * @see #isCredentialProtectedStorage()
   4258      * @hide
   4259      */
   4260     @SystemApi
   4261     public abstract Context createCredentialProtectedStorageContext();
   4262 
   4263     /** @removed */
   4264     @Deprecated
   4265     public Context createCredentialEncryptedStorageContext() {
   4266         return createCredentialProtectedStorageContext();
   4267     }
   4268 
   4269     /**
   4270      * Gets the display adjustments holder for this context.  This information
   4271      * is provided on a per-application or activity basis and is used to simulate lower density
   4272      * display metrics for legacy applications and restricted screen sizes.
   4273      *
   4274      * @param displayId The display id for which to get compatibility info.
   4275      * @return The compatibility info holder, or null if not required by the application.
   4276      * @hide
   4277      */
   4278     public abstract DisplayAdjustments getDisplayAdjustments(int displayId);
   4279 
   4280     /**
   4281      * @hide
   4282      */
   4283     public abstract Display getDisplay();
   4284 
   4285     /**
   4286      * Indicates whether this Context is restricted.
   4287      *
   4288      * @return {@code true} if this Context is restricted, {@code false} otherwise.
   4289      *
   4290      * @see #CONTEXT_RESTRICTED
   4291      */
   4292     public boolean isRestricted() {
   4293         return false;
   4294     }
   4295 
   4296     /**
   4297      * Indicates if the storage APIs of this Context are backed by
   4298      * device-protected storage.
   4299      *
   4300      * @see #createDeviceProtectedStorageContext()
   4301      */
   4302     public abstract boolean isDeviceProtectedStorage();
   4303 
   4304     /** @removed */
   4305     @Deprecated
   4306     public boolean isDeviceEncryptedStorage() {
   4307         return isDeviceProtectedStorage();
   4308     }
   4309 
   4310     /**
   4311      * Indicates if the storage APIs of this Context are backed by
   4312      * credential-protected storage.
   4313      *
   4314      * @see #createCredentialProtectedStorageContext()
   4315      * @hide
   4316      */
   4317     @SystemApi
   4318     public abstract boolean isCredentialProtectedStorage();
   4319 
   4320     /** @removed */
   4321     @Deprecated
   4322     public boolean isCredentialEncryptedStorage() {
   4323         return isCredentialProtectedStorage();
   4324     }
   4325 }
   4326