Home | History | Annotate | Download | only in pm
      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.pm;
     18 
     19 import android.Manifest;
     20 import android.annotation.CheckResult;
     21 import android.annotation.DrawableRes;
     22 import android.annotation.IntDef;
     23 import android.annotation.NonNull;
     24 import android.annotation.Nullable;
     25 import android.annotation.RequiresPermission;
     26 import android.annotation.SdkConstant;
     27 import android.annotation.SdkConstant.SdkConstantType;
     28 import android.annotation.StringRes;
     29 import android.annotation.SystemApi;
     30 import android.annotation.TestApi;
     31 import android.annotation.UserIdInt;
     32 import android.annotation.XmlRes;
     33 import android.app.PackageDeleteObserver;
     34 import android.app.PackageInstallObserver;
     35 import android.app.admin.DevicePolicyManager;
     36 import android.content.ComponentName;
     37 import android.content.Context;
     38 import android.content.Intent;
     39 import android.content.IntentFilter;
     40 import android.content.IntentSender;
     41 import android.content.pm.PackageParser.PackageParserException;
     42 import android.content.res.Resources;
     43 import android.content.res.XmlResourceParser;
     44 import android.graphics.Rect;
     45 import android.graphics.drawable.Drawable;
     46 import android.net.Uri;
     47 import android.os.Bundle;
     48 import android.os.Handler;
     49 import android.os.RemoteException;
     50 import android.os.UserHandle;
     51 import android.os.UserManager;
     52 import android.os.storage.VolumeInfo;
     53 import android.util.AndroidException;
     54 import android.util.Log;
     55 
     56 import com.android.internal.util.ArrayUtils;
     57 
     58 import java.io.File;
     59 import java.lang.annotation.Retention;
     60 import java.lang.annotation.RetentionPolicy;
     61 import java.util.List;
     62 
     63 /**
     64  * Class for retrieving various kinds of information related to the application
     65  * packages that are currently installed on the device.
     66  *
     67  * You can find this class through {@link Context#getPackageManager}.
     68  */
     69 public abstract class PackageManager {
     70     private static final String TAG = "PackageManager";
     71 
     72     /** {@hide} */
     73     public static final boolean APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE = true;
     74 
     75     /**
     76      * This exception is thrown when a given package, application, or component
     77      * name cannot be found.
     78      */
     79     public static class NameNotFoundException extends AndroidException {
     80         public NameNotFoundException() {
     81         }
     82 
     83         public NameNotFoundException(String name) {
     84             super(name);
     85         }
     86     }
     87 
     88     /**
     89      * Listener for changes in permissions granted to a UID.
     90      *
     91      * @hide
     92      */
     93     @SystemApi
     94     public interface OnPermissionsChangedListener {
     95 
     96         /**
     97          * Called when the permissions for a UID change.
     98          * @param uid The UID with a change.
     99          */
    100         public void onPermissionsChanged(int uid);
    101     }
    102 
    103     /**
    104      * As a guiding principle:
    105      * <p>
    106      * {@code GET_} flags are used to request additional data that may have been
    107      * elided to save wire space.
    108      * <p>
    109      * {@code MATCH_} flags are used to include components or packages that
    110      * would have otherwise been omitted from a result set by current system
    111      * state.
    112      */
    113 
    114     /** @hide */
    115     @IntDef(flag = true, value = {
    116             GET_ACTIVITIES,
    117             GET_CONFIGURATIONS,
    118             GET_GIDS,
    119             GET_INSTRUMENTATION,
    120             GET_INTENT_FILTERS,
    121             GET_META_DATA,
    122             GET_PERMISSIONS,
    123             GET_PROVIDERS,
    124             GET_RECEIVERS,
    125             GET_SERVICES,
    126             GET_SHARED_LIBRARY_FILES,
    127             GET_SIGNATURES,
    128             GET_URI_PERMISSION_PATTERNS,
    129             MATCH_UNINSTALLED_PACKAGES,
    130             MATCH_DISABLED_COMPONENTS,
    131             MATCH_DISABLED_UNTIL_USED_COMPONENTS,
    132             MATCH_SYSTEM_ONLY,
    133             MATCH_FACTORY_ONLY,
    134             MATCH_DEBUG_TRIAGED_MISSING,
    135     })
    136     @Retention(RetentionPolicy.SOURCE)
    137     public @interface PackageInfoFlags {}
    138 
    139     /** @hide */
    140     @IntDef(flag = true, value = {
    141             GET_META_DATA,
    142             GET_SHARED_LIBRARY_FILES,
    143             MATCH_UNINSTALLED_PACKAGES,
    144             MATCH_SYSTEM_ONLY,
    145             MATCH_DEBUG_TRIAGED_MISSING,
    146     })
    147     @Retention(RetentionPolicy.SOURCE)
    148     public @interface ApplicationInfoFlags {}
    149 
    150     /** @hide */
    151     @IntDef(flag = true, value = {
    152             GET_META_DATA,
    153             GET_SHARED_LIBRARY_FILES,
    154             MATCH_ALL,
    155             MATCH_DEBUG_TRIAGED_MISSING,
    156             MATCH_DEFAULT_ONLY,
    157             MATCH_DISABLED_COMPONENTS,
    158             MATCH_DISABLED_UNTIL_USED_COMPONENTS,
    159             MATCH_DIRECT_BOOT_AWARE,
    160             MATCH_DIRECT_BOOT_UNAWARE,
    161             MATCH_SYSTEM_ONLY,
    162             MATCH_UNINSTALLED_PACKAGES,
    163     })
    164     @Retention(RetentionPolicy.SOURCE)
    165     public @interface ComponentInfoFlags {}
    166 
    167     /** @hide */
    168     @IntDef(flag = true, value = {
    169             GET_META_DATA,
    170             GET_RESOLVED_FILTER,
    171             GET_SHARED_LIBRARY_FILES,
    172             MATCH_ALL,
    173             MATCH_DEBUG_TRIAGED_MISSING,
    174             MATCH_DISABLED_COMPONENTS,
    175             MATCH_DISABLED_UNTIL_USED_COMPONENTS,
    176             MATCH_DEFAULT_ONLY,
    177             MATCH_DIRECT_BOOT_AWARE,
    178             MATCH_DIRECT_BOOT_UNAWARE,
    179             MATCH_SYSTEM_ONLY,
    180             MATCH_UNINSTALLED_PACKAGES,
    181     })
    182     @Retention(RetentionPolicy.SOURCE)
    183     public @interface ResolveInfoFlags {}
    184 
    185     /** @hide */
    186     @IntDef(flag = true, value = {
    187             GET_META_DATA,
    188     })
    189     @Retention(RetentionPolicy.SOURCE)
    190     public @interface PermissionInfoFlags {}
    191 
    192     /** @hide */
    193     @IntDef(flag = true, value = {
    194             GET_META_DATA,
    195     })
    196     @Retention(RetentionPolicy.SOURCE)
    197     public @interface PermissionGroupInfoFlags {}
    198 
    199     /** @hide */
    200     @IntDef(flag = true, value = {
    201             GET_META_DATA,
    202     })
    203     @Retention(RetentionPolicy.SOURCE)
    204     public @interface InstrumentationInfoFlags {}
    205 
    206     /**
    207      * {@link PackageInfo} flag: return information about
    208      * activities in the package in {@link PackageInfo#activities}.
    209      */
    210     public static final int GET_ACTIVITIES              = 0x00000001;
    211 
    212     /**
    213      * {@link PackageInfo} flag: return information about
    214      * intent receivers in the package in
    215      * {@link PackageInfo#receivers}.
    216      */
    217     public static final int GET_RECEIVERS               = 0x00000002;
    218 
    219     /**
    220      * {@link PackageInfo} flag: return information about
    221      * services in the package in {@link PackageInfo#services}.
    222      */
    223     public static final int GET_SERVICES                = 0x00000004;
    224 
    225     /**
    226      * {@link PackageInfo} flag: return information about
    227      * content providers in the package in
    228      * {@link PackageInfo#providers}.
    229      */
    230     public static final int GET_PROVIDERS               = 0x00000008;
    231 
    232     /**
    233      * {@link PackageInfo} flag: return information about
    234      * instrumentation in the package in
    235      * {@link PackageInfo#instrumentation}.
    236      */
    237     public static final int GET_INSTRUMENTATION         = 0x00000010;
    238 
    239     /**
    240      * {@link PackageInfo} flag: return information about the
    241      * intent filters supported by the activity.
    242      */
    243     public static final int GET_INTENT_FILTERS          = 0x00000020;
    244 
    245     /**
    246      * {@link PackageInfo} flag: return information about the
    247      * signatures included in the package.
    248      */
    249     public static final int GET_SIGNATURES          = 0x00000040;
    250 
    251     /**
    252      * {@link ResolveInfo} flag: return the IntentFilter that
    253      * was matched for a particular ResolveInfo in
    254      * {@link ResolveInfo#filter}.
    255      */
    256     public static final int GET_RESOLVED_FILTER         = 0x00000040;
    257 
    258     /**
    259      * {@link ComponentInfo} flag: return the {@link ComponentInfo#metaData}
    260      * data {@link android.os.Bundle}s that are associated with a component.
    261      * This applies for any API returning a ComponentInfo subclass.
    262      */
    263     public static final int GET_META_DATA               = 0x00000080;
    264 
    265     /**
    266      * {@link PackageInfo} flag: return the
    267      * {@link PackageInfo#gids group ids} that are associated with an
    268      * application.
    269      * This applies for any API returning a PackageInfo class, either
    270      * directly or nested inside of another.
    271      */
    272     public static final int GET_GIDS                    = 0x00000100;
    273 
    274     /**
    275      * @deprecated replaced with {@link #MATCH_DISABLED_COMPONENTS}
    276      */
    277     @Deprecated
    278     public static final int GET_DISABLED_COMPONENTS = 0x00000200;
    279 
    280     /**
    281      * {@link PackageInfo} flag: include disabled components in the returned info.
    282      */
    283     public static final int MATCH_DISABLED_COMPONENTS = 0x00000200;
    284 
    285     /**
    286      * {@link ApplicationInfo} flag: return the
    287      * {@link ApplicationInfo#sharedLibraryFiles paths to the shared libraries}
    288      * that are associated with an application.
    289      * This applies for any API returning an ApplicationInfo class, either
    290      * directly or nested inside of another.
    291      */
    292     public static final int GET_SHARED_LIBRARY_FILES    = 0x00000400;
    293 
    294     /**
    295      * {@link ProviderInfo} flag: return the
    296      * {@link ProviderInfo#uriPermissionPatterns URI permission patterns}
    297      * that are associated with a content provider.
    298      * This applies for any API returning a ProviderInfo class, either
    299      * directly or nested inside of another.
    300      */
    301     public static final int GET_URI_PERMISSION_PATTERNS  = 0x00000800;
    302     /**
    303      * {@link PackageInfo} flag: return information about
    304      * permissions in the package in
    305      * {@link PackageInfo#permissions}.
    306      */
    307     public static final int GET_PERMISSIONS               = 0x00001000;
    308 
    309     /**
    310      * @deprecated replaced with {@link #MATCH_UNINSTALLED_PACKAGES}
    311      */
    312     @Deprecated
    313     public static final int GET_UNINSTALLED_PACKAGES = 0x00002000;
    314 
    315     /**
    316      * Flag parameter to retrieve some information about all applications (even
    317      * uninstalled ones) which have data directories. This state could have
    318      * resulted if applications have been deleted with flag
    319      * {@code DONT_DELETE_DATA} with a possibility of being replaced or
    320      * reinstalled in future.
    321      * <p>
    322      * Note: this flag may cause less information about currently installed
    323      * applications to be returned.
    324      */
    325     public static final int MATCH_UNINSTALLED_PACKAGES = 0x00002000;
    326 
    327     /**
    328      * {@link PackageInfo} flag: return information about
    329      * hardware preferences in
    330      * {@link PackageInfo#configPreferences PackageInfo.configPreferences},
    331      * and requested features in {@link PackageInfo#reqFeatures} and
    332      * {@link PackageInfo#featureGroups}.
    333      */
    334     public static final int GET_CONFIGURATIONS = 0x00004000;
    335 
    336     /**
    337      * @deprecated replaced with {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS}.
    338      */
    339     @Deprecated
    340     public static final int GET_DISABLED_UNTIL_USED_COMPONENTS = 0x00008000;
    341 
    342     /**
    343      * {@link PackageInfo} flag: include disabled components which are in
    344      * that state only because of {@link #COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED}
    345      * in the returned info.  Note that if you set this flag, applications
    346      * that are in this disabled state will be reported as enabled.
    347      */
    348     public static final int MATCH_DISABLED_UNTIL_USED_COMPONENTS = 0x00008000;
    349 
    350     /**
    351      * Resolution and querying flag: if set, only filters that support the
    352      * {@link android.content.Intent#CATEGORY_DEFAULT} will be considered for
    353      * matching.  This is a synonym for including the CATEGORY_DEFAULT in your
    354      * supplied Intent.
    355      */
    356     public static final int MATCH_DEFAULT_ONLY  = 0x00010000;
    357 
    358     /**
    359      * Querying flag: if set and if the platform is doing any filtering of the
    360      * results, then the filtering will not happen. This is a synonym for saying
    361      * that all results should be returned.
    362      * <p>
    363      * <em>This flag should be used with extreme care.</em>
    364      */
    365     public static final int MATCH_ALL = 0x00020000;
    366 
    367     /**
    368      * Querying flag: match components which are direct boot <em>unaware</em> in
    369      * the returned info, regardless of the current user state.
    370      * <p>
    371      * When neither {@link #MATCH_DIRECT_BOOT_AWARE} nor
    372      * {@link #MATCH_DIRECT_BOOT_UNAWARE} are specified, the default behavior is
    373      * to match only runnable components based on the user state. For example,
    374      * when a user is started but credentials have not been presented yet, the
    375      * user is running "locked" and only {@link #MATCH_DIRECT_BOOT_AWARE}
    376      * components are returned. Once the user credentials have been presented,
    377      * the user is running "unlocked" and both {@link #MATCH_DIRECT_BOOT_AWARE}
    378      * and {@link #MATCH_DIRECT_BOOT_UNAWARE} components are returned.
    379      *
    380      * @see UserManager#isUserUnlocked()
    381      */
    382     public static final int MATCH_DIRECT_BOOT_UNAWARE = 0x00040000;
    383 
    384     /**
    385      * Querying flag: match components which are direct boot <em>aware</em> in
    386      * the returned info, regardless of the current user state.
    387      * <p>
    388      * When neither {@link #MATCH_DIRECT_BOOT_AWARE} nor
    389      * {@link #MATCH_DIRECT_BOOT_UNAWARE} are specified, the default behavior is
    390      * to match only runnable components based on the user state. For example,
    391      * when a user is started but credentials have not been presented yet, the
    392      * user is running "locked" and only {@link #MATCH_DIRECT_BOOT_AWARE}
    393      * components are returned. Once the user credentials have been presented,
    394      * the user is running "unlocked" and both {@link #MATCH_DIRECT_BOOT_AWARE}
    395      * and {@link #MATCH_DIRECT_BOOT_UNAWARE} components are returned.
    396      *
    397      * @see UserManager#isUserUnlocked()
    398      */
    399     public static final int MATCH_DIRECT_BOOT_AWARE = 0x00080000;
    400 
    401     /** @removed */
    402     @Deprecated
    403     public static final int MATCH_ENCRYPTION_UNAWARE = 0x00040000;
    404     /** @removed */
    405     @Deprecated
    406     public static final int MATCH_ENCRYPTION_AWARE = 0x00080000;
    407     /** @removed */
    408     @Deprecated
    409     public static final int MATCH_ENCRYPTION_AWARE_AND_UNAWARE = MATCH_ENCRYPTION_AWARE
    410             | MATCH_ENCRYPTION_UNAWARE;
    411 
    412     /**
    413      * Querying flag: include only components from applications that are marked
    414      * with {@link ApplicationInfo#FLAG_SYSTEM}.
    415      */
    416     public static final int MATCH_SYSTEM_ONLY = 0x00100000;
    417 
    418     /**
    419      * Internal {@link PackageInfo} flag: include only components on the system image.
    420      * This will not return information on any unbundled update to system components.
    421      * @hide
    422      */
    423     public static final int MATCH_FACTORY_ONLY = 0x00200000;
    424 
    425     /**
    426      * Internal flag used to indicate that a system component has done their
    427      * homework and verified that they correctly handle packages and components
    428      * that come and go over time. In particular:
    429      * <ul>
    430      * <li>Apps installed on external storage, which will appear to be
    431      * uninstalled while the the device is ejected.
    432      * <li>Apps with encryption unaware components, which will appear to not
    433      * exist while the device is locked.
    434      * </ul>
    435      *
    436      * @see #MATCH_UNINSTALLED_PACKAGES
    437      * @see #MATCH_DIRECT_BOOT_AWARE
    438      * @see #MATCH_DIRECT_BOOT_UNAWARE
    439      * @hide
    440      */
    441     public static final int MATCH_DEBUG_TRIAGED_MISSING = 0x10000000;
    442 
    443     /**
    444      * Flag for {@link #addCrossProfileIntentFilter}: if this flag is set: when
    445      * resolving an intent that matches the {@code CrossProfileIntentFilter},
    446      * the current profile will be skipped. Only activities in the target user
    447      * can respond to the intent.
    448      *
    449      * @hide
    450      */
    451     public static final int SKIP_CURRENT_PROFILE = 0x00000002;
    452 
    453     /**
    454      * Flag for {@link #addCrossProfileIntentFilter}: if this flag is set:
    455      * activities in the other profiles can respond to the intent only if no activity with
    456      * non-negative priority in current profile can respond to the intent.
    457      * @hide
    458      */
    459     public static final int ONLY_IF_NO_MATCH_FOUND = 0x00000004;
    460 
    461     /** @hide */
    462     @IntDef({PERMISSION_GRANTED, PERMISSION_DENIED})
    463     @Retention(RetentionPolicy.SOURCE)
    464     public @interface PermissionResult {}
    465 
    466     /**
    467      * Permission check result: this is returned by {@link #checkPermission}
    468      * if the permission has been granted to the given package.
    469      */
    470     public static final int PERMISSION_GRANTED = 0;
    471 
    472     /**
    473      * Permission check result: this is returned by {@link #checkPermission}
    474      * if the permission has not been granted to the given package.
    475      */
    476     public static final int PERMISSION_DENIED = -1;
    477 
    478     /**
    479      * Signature check result: this is returned by {@link #checkSignatures}
    480      * if all signatures on the two packages match.
    481      */
    482     public static final int SIGNATURE_MATCH = 0;
    483 
    484     /**
    485      * Signature check result: this is returned by {@link #checkSignatures}
    486      * if neither of the two packages is signed.
    487      */
    488     public static final int SIGNATURE_NEITHER_SIGNED = 1;
    489 
    490     /**
    491      * Signature check result: this is returned by {@link #checkSignatures}
    492      * if the first package is not signed but the second is.
    493      */
    494     public static final int SIGNATURE_FIRST_NOT_SIGNED = -1;
    495 
    496     /**
    497      * Signature check result: this is returned by {@link #checkSignatures}
    498      * if the second package is not signed but the first is.
    499      */
    500     public static final int SIGNATURE_SECOND_NOT_SIGNED = -2;
    501 
    502     /**
    503      * Signature check result: this is returned by {@link #checkSignatures}
    504      * if not all signatures on both packages match.
    505      */
    506     public static final int SIGNATURE_NO_MATCH = -3;
    507 
    508     /**
    509      * Signature check result: this is returned by {@link #checkSignatures}
    510      * if either of the packages are not valid.
    511      */
    512     public static final int SIGNATURE_UNKNOWN_PACKAGE = -4;
    513 
    514     /**
    515      * Flag for {@link #setApplicationEnabledSetting(String, int, int)}
    516      * and {@link #setComponentEnabledSetting(ComponentName, int, int)}: This
    517      * component or application is in its default enabled state (as specified
    518      * in its manifest).
    519      */
    520     public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0;
    521 
    522     /**
    523      * Flag for {@link #setApplicationEnabledSetting(String, int, int)}
    524      * and {@link #setComponentEnabledSetting(ComponentName, int, int)}: This
    525      * component or application has been explictily enabled, regardless of
    526      * what it has specified in its manifest.
    527      */
    528     public static final int COMPONENT_ENABLED_STATE_ENABLED = 1;
    529 
    530     /**
    531      * Flag for {@link #setApplicationEnabledSetting(String, int, int)}
    532      * and {@link #setComponentEnabledSetting(ComponentName, int, int)}: This
    533      * component or application has been explicitly disabled, regardless of
    534      * what it has specified in its manifest.
    535      */
    536     public static final int COMPONENT_ENABLED_STATE_DISABLED = 2;
    537 
    538     /**
    539      * Flag for {@link #setApplicationEnabledSetting(String, int, int)} only: The
    540      * user has explicitly disabled the application, regardless of what it has
    541      * specified in its manifest.  Because this is due to the user's request,
    542      * they may re-enable it if desired through the appropriate system UI.  This
    543      * option currently <strong>cannot</strong> be used with
    544      * {@link #setComponentEnabledSetting(ComponentName, int, int)}.
    545      */
    546     public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3;
    547 
    548     /**
    549      * Flag for {@link #setApplicationEnabledSetting(String, int, int)} only: This
    550      * application should be considered, until the point where the user actually
    551      * wants to use it.  This means that it will not normally show up to the user
    552      * (such as in the launcher), but various parts of the user interface can
    553      * use {@link #GET_DISABLED_UNTIL_USED_COMPONENTS} to still see it and allow
    554      * the user to select it (as for example an IME, device admin, etc).  Such code,
    555      * once the user has selected the app, should at that point also make it enabled.
    556      * This option currently <strong>can not</strong> be used with
    557      * {@link #setComponentEnabledSetting(ComponentName, int, int)}.
    558      */
    559     public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4;
    560 
    561     /** @hide */
    562     @IntDef(flag = true, value = {
    563             INSTALL_FORWARD_LOCK,
    564             INSTALL_REPLACE_EXISTING,
    565             INSTALL_ALLOW_TEST,
    566             INSTALL_EXTERNAL,
    567             INSTALL_INTERNAL,
    568             INSTALL_FROM_ADB,
    569             INSTALL_ALL_USERS,
    570             INSTALL_ALLOW_DOWNGRADE,
    571             INSTALL_GRANT_RUNTIME_PERMISSIONS,
    572             INSTALL_FORCE_VOLUME_UUID,
    573             INSTALL_FORCE_PERMISSION_PROMPT,
    574             INSTALL_EPHEMERAL,
    575             INSTALL_DONT_KILL_APP,
    576     })
    577     @Retention(RetentionPolicy.SOURCE)
    578     public @interface InstallFlags {}
    579 
    580     /**
    581      * Flag parameter for {@link #installPackage} to indicate that this package
    582      * should be installed as forward locked, i.e. only the app itself should
    583      * have access to its code and non-resource assets.
    584      *
    585      * @hide
    586      */
    587     public static final int INSTALL_FORWARD_LOCK = 0x00000001;
    588 
    589     /**
    590      * Flag parameter for {@link #installPackage} to indicate that you want to
    591      * replace an already installed package, if one exists.
    592      *
    593      * @hide
    594      */
    595     public static final int INSTALL_REPLACE_EXISTING = 0x00000002;
    596 
    597     /**
    598      * Flag parameter for {@link #installPackage} to indicate that you want to
    599      * allow test packages (those that have set android:testOnly in their
    600      * manifest) to be installed.
    601      * @hide
    602      */
    603     public static final int INSTALL_ALLOW_TEST = 0x00000004;
    604 
    605     /**
    606      * Flag parameter for {@link #installPackage} to indicate that this package
    607      * must be installed to an ASEC on a {@link VolumeInfo#TYPE_PUBLIC}.
    608      *
    609      * @hide
    610      */
    611     public static final int INSTALL_EXTERNAL = 0x00000008;
    612 
    613     /**
    614      * Flag parameter for {@link #installPackage} to indicate that this package
    615      * must be installed to internal storage.
    616      *
    617      * @hide
    618      */
    619     public static final int INSTALL_INTERNAL = 0x00000010;
    620 
    621     /**
    622      * Flag parameter for {@link #installPackage} to indicate that this install
    623      * was initiated via ADB.
    624      *
    625      * @hide
    626      */
    627     public static final int INSTALL_FROM_ADB = 0x00000020;
    628 
    629     /**
    630      * Flag parameter for {@link #installPackage} to indicate that this install
    631      * should immediately be visible to all users.
    632      *
    633      * @hide
    634      */
    635     public static final int INSTALL_ALL_USERS = 0x00000040;
    636 
    637     /**
    638      * Flag parameter for {@link #installPackage} to indicate that it is okay
    639      * to install an update to an app where the newly installed app has a lower
    640      * version code than the currently installed app. This is permitted only if
    641      * the currently installed app is marked debuggable.
    642      *
    643      * @hide
    644      */
    645     public static final int INSTALL_ALLOW_DOWNGRADE = 0x00000080;
    646 
    647     /**
    648      * Flag parameter for {@link #installPackage} to indicate that all runtime
    649      * permissions should be granted to the package. If {@link #INSTALL_ALL_USERS}
    650      * is set the runtime permissions will be granted to all users, otherwise
    651      * only to the owner.
    652      *
    653      * @hide
    654      */
    655     public static final int INSTALL_GRANT_RUNTIME_PERMISSIONS = 0x00000100;
    656 
    657     /** {@hide} */
    658     public static final int INSTALL_FORCE_VOLUME_UUID = 0x00000200;
    659 
    660     /**
    661      * Flag parameter for {@link #installPackage} to indicate that we always want to force
    662      * the prompt for permission approval. This overrides any special behaviour for internal
    663      * components.
    664      *
    665      * @hide
    666      */
    667     public static final int INSTALL_FORCE_PERMISSION_PROMPT = 0x00000400;
    668 
    669     /**
    670      * Flag parameter for {@link #installPackage} to indicate that this package is
    671      * to be installed as a lightweight "ephemeral" app.
    672      *
    673      * @hide
    674      */
    675     public static final int INSTALL_EPHEMERAL = 0x00000800;
    676 
    677     /**
    678      * Flag parameter for {@link #installPackage} to indicate that this package contains
    679      * a feature split to an existing application and the existing application should not
    680      * be killed during the installation process.
    681      *
    682      * @hide
    683      */
    684     public static final int INSTALL_DONT_KILL_APP = 0x00001000;
    685 
    686     /**
    687      * Flag parameter for {@link #installPackage} to indicate that this package is an
    688      * upgrade to a package that refers to the SDK via release letter.
    689      *
    690      * @hide
    691      */
    692     public static final int INSTALL_FORCE_SDK = 0x00002000;
    693 
    694     /**
    695      * Flag parameter for
    696      * {@link #setComponentEnabledSetting(android.content.ComponentName, int, int)} to indicate
    697      * that you don't want to kill the app containing the component.  Be careful when you set this
    698      * since changing component states can make the containing application's behavior unpredictable.
    699      */
    700     public static final int DONT_KILL_APP = 0x00000001;
    701 
    702     /**
    703      * Installation return code: this is passed to the
    704      * {@link IPackageInstallObserver} on success.
    705      *
    706      * @hide
    707      */
    708     @SystemApi
    709     public static final int INSTALL_SUCCEEDED = 1;
    710 
    711     /**
    712      * Installation return code: this is passed to the
    713      * {@link IPackageInstallObserver} if the package is already installed.
    714      *
    715      * @hide
    716      */
    717     @SystemApi
    718     public static final int INSTALL_FAILED_ALREADY_EXISTS = -1;
    719 
    720     /**
    721      * Installation return code: this is passed to the
    722      * {@link IPackageInstallObserver} if the package archive file is invalid.
    723      *
    724      * @hide
    725      */
    726     @SystemApi
    727     public static final int INSTALL_FAILED_INVALID_APK = -2;
    728 
    729     /**
    730      * Installation return code: this is passed to the
    731      * {@link IPackageInstallObserver} if the URI passed in is invalid.
    732      *
    733      * @hide
    734      */
    735     @SystemApi
    736     public static final int INSTALL_FAILED_INVALID_URI = -3;
    737 
    738     /**
    739      * Installation return code: this is passed to the
    740      * {@link IPackageInstallObserver} if the package manager service found that
    741      * the device didn't have enough storage space to install the app.
    742      *
    743      * @hide
    744      */
    745     @SystemApi
    746     public static final int INSTALL_FAILED_INSUFFICIENT_STORAGE = -4;
    747 
    748     /**
    749      * Installation return code: this is passed to the
    750      * {@link IPackageInstallObserver} if a package is already installed with
    751      * the same name.
    752      *
    753      * @hide
    754      */
    755     @SystemApi
    756     public static final int INSTALL_FAILED_DUPLICATE_PACKAGE = -5;
    757 
    758     /**
    759      * Installation return code: this is passed to the
    760      * {@link IPackageInstallObserver} if the requested shared user does not
    761      * exist.
    762      *
    763      * @hide
    764      */
    765     @SystemApi
    766     public static final int INSTALL_FAILED_NO_SHARED_USER = -6;
    767 
    768     /**
    769      * Installation return code: this is passed to the
    770      * {@link IPackageInstallObserver} if a previously installed package of the
    771      * same name has a different signature than the new package (and the old
    772      * package's data was not removed).
    773      *
    774      * @hide
    775      */
    776     @SystemApi
    777     public static final int INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7;
    778 
    779     /**
    780      * Installation return code: this is passed to the
    781      * {@link IPackageInstallObserver} if the new package is requested a shared
    782      * user which is already installed on the device and does not have matching
    783      * signature.
    784      *
    785      * @hide
    786      */
    787     @SystemApi
    788     public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8;
    789 
    790     /**
    791      * Installation return code: this is passed to the
    792      * {@link IPackageInstallObserver} if the new package uses a shared library
    793      * that is not available.
    794      *
    795      * @hide
    796      */
    797     @SystemApi
    798     public static final int INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9;
    799 
    800     /**
    801      * Installation return code: this is passed to the
    802      * {@link IPackageInstallObserver} if the new package uses a shared library
    803      * that is not available.
    804      *
    805      * @hide
    806      */
    807     @SystemApi
    808     public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10;
    809 
    810     /**
    811      * Installation return code: this is passed to the
    812      * {@link IPackageInstallObserver} if the new package failed while
    813      * optimizing and validating its dex files, either because there was not
    814      * enough storage or the validation failed.
    815      *
    816      * @hide
    817      */
    818     @SystemApi
    819     public static final int INSTALL_FAILED_DEXOPT = -11;
    820 
    821     /**
    822      * Installation return code: this is passed to the
    823      * {@link IPackageInstallObserver} if the new package failed because the
    824      * current SDK version is older than that required by the package.
    825      *
    826      * @hide
    827      */
    828     @SystemApi
    829     public static final int INSTALL_FAILED_OLDER_SDK = -12;
    830 
    831     /**
    832      * Installation return code: this is passed to the
    833      * {@link IPackageInstallObserver} if the new package failed because it
    834      * contains a content provider with the same authority as a provider already
    835      * installed in the system.
    836      *
    837      * @hide
    838      */
    839     @SystemApi
    840     public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13;
    841 
    842     /**
    843      * Installation return code: this is passed to the
    844      * {@link IPackageInstallObserver} if the new package failed because the
    845      * current SDK version is newer than that required by the package.
    846      *
    847      * @hide
    848      */
    849     @SystemApi
    850     public static final int INSTALL_FAILED_NEWER_SDK = -14;
    851 
    852     /**
    853      * Installation return code: this is passed to the
    854      * {@link IPackageInstallObserver} if the new package failed because it has
    855      * specified that it is a test-only package and the caller has not supplied
    856      * the {@link #INSTALL_ALLOW_TEST} flag.
    857      *
    858      * @hide
    859      */
    860     @SystemApi
    861     public static final int INSTALL_FAILED_TEST_ONLY = -15;
    862 
    863     /**
    864      * Installation return code: this is passed to the
    865      * {@link IPackageInstallObserver} if the package being installed contains
    866      * native code, but none that is compatible with the device's CPU_ABI.
    867      *
    868      * @hide
    869      */
    870     @SystemApi
    871     public static final int INSTALL_FAILED_CPU_ABI_INCOMPATIBLE = -16;
    872 
    873     /**
    874      * Installation return code: this is passed to the
    875      * {@link IPackageInstallObserver} if the new package uses a feature that is
    876      * not available.
    877      *
    878      * @hide
    879      */
    880     @SystemApi
    881     public static final int INSTALL_FAILED_MISSING_FEATURE = -17;
    882 
    883     // ------ Errors related to sdcard
    884     /**
    885      * Installation return code: this is passed to the
    886      * {@link IPackageInstallObserver} if a secure container mount point
    887      * couldn't be accessed on external media.
    888      *
    889      * @hide
    890      */
    891     @SystemApi
    892     public static final int INSTALL_FAILED_CONTAINER_ERROR = -18;
    893 
    894     /**
    895      * Installation return code: this is passed to the
    896      * {@link IPackageInstallObserver} if the new package couldn't be installed
    897      * in the specified install location.
    898      *
    899      * @hide
    900      */
    901     @SystemApi
    902     public static final int INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19;
    903 
    904     /**
    905      * Installation return code: this is passed to the
    906      * {@link IPackageInstallObserver} if the new package couldn't be installed
    907      * in the specified install location because the media is not available.
    908      *
    909      * @hide
    910      */
    911     @SystemApi
    912     public static final int INSTALL_FAILED_MEDIA_UNAVAILABLE = -20;
    913 
    914     /**
    915      * Installation return code: this is passed to the
    916      * {@link IPackageInstallObserver} if the new package couldn't be installed
    917      * because the verification timed out.
    918      *
    919      * @hide
    920      */
    921     @SystemApi
    922     public static final int INSTALL_FAILED_VERIFICATION_TIMEOUT = -21;
    923 
    924     /**
    925      * Installation return code: this is passed to the
    926      * {@link IPackageInstallObserver} if the new package couldn't be installed
    927      * because the verification did not succeed.
    928      *
    929      * @hide
    930      */
    931     @SystemApi
    932     public static final int INSTALL_FAILED_VERIFICATION_FAILURE = -22;
    933 
    934     /**
    935      * Installation return code: this is passed to the
    936      * {@link IPackageInstallObserver} if the package changed from what the
    937      * calling program expected.
    938      *
    939      * @hide
    940      */
    941     @SystemApi
    942     public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23;
    943 
    944     /**
    945      * Installation return code: this is passed to the
    946      * {@link IPackageInstallObserver} if the new package is assigned a
    947      * different UID than it previously held.
    948      *
    949      * @hide
    950      */
    951     public static final int INSTALL_FAILED_UID_CHANGED = -24;
    952 
    953     /**
    954      * Installation return code: this is passed to the
    955      * {@link IPackageInstallObserver} if the new package has an older version
    956      * code than the currently installed package.
    957      *
    958      * @hide
    959      */
    960     public static final int INSTALL_FAILED_VERSION_DOWNGRADE = -25;
    961 
    962     /**
    963      * Installation return code: this is passed to the
    964      * {@link IPackageInstallObserver} if the old package has target SDK high
    965      * enough to support runtime permission and the new package has target SDK
    966      * low enough to not support runtime permissions.
    967      *
    968      * @hide
    969      */
    970     @SystemApi
    971     public static final int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE = -26;
    972 
    973     /**
    974      * Installation parse return code: this is passed to the
    975      * {@link IPackageInstallObserver} if the parser was given a path that is
    976      * not a file, or does not end with the expected '.apk' extension.
    977      *
    978      * @hide
    979      */
    980     @SystemApi
    981     public static final int INSTALL_PARSE_FAILED_NOT_APK = -100;
    982 
    983     /**
    984      * Installation parse return code: this is passed to the
    985      * {@link IPackageInstallObserver} if the parser was unable to retrieve the
    986      * AndroidManifest.xml file.
    987      *
    988      * @hide
    989      */
    990     @SystemApi
    991     public static final int INSTALL_PARSE_FAILED_BAD_MANIFEST = -101;
    992 
    993     /**
    994      * Installation parse return code: this is passed to the
    995      * {@link IPackageInstallObserver} if the parser encountered an unexpected
    996      * exception.
    997      *
    998      * @hide
    999      */
   1000     @SystemApi
   1001     public static final int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION = -102;
   1002 
   1003     /**
   1004      * Installation parse return code: this is passed to the
   1005      * {@link IPackageInstallObserver} if the parser did not find any
   1006      * certificates in the .apk.
   1007      *
   1008      * @hide
   1009      */
   1010     @SystemApi
   1011     public static final int INSTALL_PARSE_FAILED_NO_CERTIFICATES = -103;
   1012 
   1013     /**
   1014      * Installation parse return code: this is passed to the
   1015      * {@link IPackageInstallObserver} if the parser found inconsistent
   1016      * certificates on the files in the .apk.
   1017      *
   1018      * @hide
   1019      */
   1020     @SystemApi
   1021     public static final int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES = -104;
   1022 
   1023     /**
   1024      * Installation parse return code: this is passed to the
   1025      * {@link IPackageInstallObserver} if the parser encountered a
   1026      * CertificateEncodingException in one of the files in the .apk.
   1027      *
   1028      * @hide
   1029      */
   1030     @SystemApi
   1031     public static final int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING = -105;
   1032 
   1033     /**
   1034      * Installation parse return code: this is passed to the
   1035      * {@link IPackageInstallObserver} if the parser encountered a bad or
   1036      * missing package name in the manifest.
   1037      *
   1038      * @hide
   1039      */
   1040     @SystemApi
   1041     public static final int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME = -106;
   1042 
   1043     /**
   1044      * Installation parse return code: this is passed to the
   1045      * {@link IPackageInstallObserver} if the parser encountered a bad shared
   1046      * user id name in the manifest.
   1047      *
   1048      * @hide
   1049      */
   1050     @SystemApi
   1051     public static final int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID = -107;
   1052 
   1053     /**
   1054      * Installation parse return code: this is passed to the
   1055      * {@link IPackageInstallObserver} if the parser encountered some structural
   1056      * problem in the manifest.
   1057      *
   1058      * @hide
   1059      */
   1060     @SystemApi
   1061     public static final int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED = -108;
   1062 
   1063     /**
   1064      * Installation parse return code: this is passed to the
   1065      * {@link IPackageInstallObserver} if the parser did not find any actionable
   1066      * tags (instrumentation or application) in the manifest.
   1067      *
   1068      * @hide
   1069      */
   1070     @SystemApi
   1071     public static final int INSTALL_PARSE_FAILED_MANIFEST_EMPTY = -109;
   1072 
   1073     /**
   1074      * Installation failed return code: this is passed to the
   1075      * {@link IPackageInstallObserver} if the system failed to install the
   1076      * package because of system issues.
   1077      *
   1078      * @hide
   1079      */
   1080     @SystemApi
   1081     public static final int INSTALL_FAILED_INTERNAL_ERROR = -110;
   1082 
   1083     /**
   1084      * Installation failed return code: this is passed to the
   1085      * {@link IPackageInstallObserver} if the system failed to install the
   1086      * package because the user is restricted from installing apps.
   1087      *
   1088      * @hide
   1089      */
   1090     public static final int INSTALL_FAILED_USER_RESTRICTED = -111;
   1091 
   1092     /**
   1093      * Installation failed return code: this is passed to the
   1094      * {@link IPackageInstallObserver} if the system failed to install the
   1095      * package because it is attempting to define a permission that is already
   1096      * defined by some existing package.
   1097      * <p>
   1098      * The package name of the app which has already defined the permission is
   1099      * passed to a {@link PackageInstallObserver}, if any, as the
   1100      * {@link #EXTRA_FAILURE_EXISTING_PACKAGE} string extra; and the name of the
   1101      * permission being redefined is passed in the
   1102      * {@link #EXTRA_FAILURE_EXISTING_PERMISSION} string extra.
   1103      *
   1104      * @hide
   1105      */
   1106     public static final int INSTALL_FAILED_DUPLICATE_PERMISSION = -112;
   1107 
   1108     /**
   1109      * Installation failed return code: this is passed to the
   1110      * {@link IPackageInstallObserver} if the system failed to install the
   1111      * package because its packaged native code did not match any of the ABIs
   1112      * supported by the system.
   1113      *
   1114      * @hide
   1115      */
   1116     public static final int INSTALL_FAILED_NO_MATCHING_ABIS = -113;
   1117 
   1118     /**
   1119      * Internal return code for NativeLibraryHelper methods to indicate that the package
   1120      * being processed did not contain any native code. This is placed here only so that
   1121      * it can belong to the same value space as the other install failure codes.
   1122      *
   1123      * @hide
   1124      */
   1125     public static final int NO_NATIVE_LIBRARIES = -114;
   1126 
   1127     /** {@hide} */
   1128     public static final int INSTALL_FAILED_ABORTED = -115;
   1129 
   1130     /**
   1131      * Installation failed return code: ephemeral app installs are incompatible with some
   1132      * other installation flags supplied for the operation; or other circumstances such
   1133      * as trying to upgrade a system app via an ephemeral install.
   1134      * @hide
   1135      */
   1136     public static final int INSTALL_FAILED_EPHEMERAL_INVALID = -116;
   1137 
   1138     /** @hide */
   1139     @IntDef(flag = true, value = {
   1140             DELETE_KEEP_DATA,
   1141             DELETE_ALL_USERS,
   1142             DELETE_SYSTEM_APP,
   1143             DELETE_DONT_KILL_APP,
   1144     })
   1145     @Retention(RetentionPolicy.SOURCE)
   1146     public @interface DeleteFlags {}
   1147 
   1148     /**
   1149      * Flag parameter for {@link #deletePackage} to indicate that you don't want to delete the
   1150      * package's data directory.
   1151      *
   1152      * @hide
   1153      */
   1154     public static final int DELETE_KEEP_DATA = 0x00000001;
   1155 
   1156     /**
   1157      * Flag parameter for {@link #deletePackage} to indicate that you want the
   1158      * package deleted for all users.
   1159      *
   1160      * @hide
   1161      */
   1162     public static final int DELETE_ALL_USERS = 0x00000002;
   1163 
   1164     /**
   1165      * Flag parameter for {@link #deletePackage} to indicate that, if you are calling
   1166      * uninstall on a system that has been updated, then don't do the normal process
   1167      * of uninstalling the update and rolling back to the older system version (which
   1168      * needs to happen for all users); instead, just mark the app as uninstalled for
   1169      * the current user.
   1170      *
   1171      * @hide
   1172      */
   1173     public static final int DELETE_SYSTEM_APP = 0x00000004;
   1174 
   1175     /**
   1176      * Flag parameter for {@link #deletePackage} to indicate that, if you are calling
   1177      * uninstall on a package that is replaced to provide new feature splits, the
   1178      * existing application should not be killed during the removal process.
   1179      *
   1180      * @hide
   1181      */
   1182     public static final int DELETE_DONT_KILL_APP = 0x00000008;
   1183 
   1184     /**
   1185      * Return code for when package deletion succeeds. This is passed to the
   1186      * {@link IPackageDeleteObserver} if the system succeeded in deleting the
   1187      * package.
   1188      *
   1189      * @hide
   1190      */
   1191     public static final int DELETE_SUCCEEDED = 1;
   1192 
   1193     /**
   1194      * Deletion failed return code: this is passed to the
   1195      * {@link IPackageDeleteObserver} if the system failed to delete the package
   1196      * for an unspecified reason.
   1197      *
   1198      * @hide
   1199      */
   1200     public static final int DELETE_FAILED_INTERNAL_ERROR = -1;
   1201 
   1202     /**
   1203      * Deletion failed return code: this is passed to the
   1204      * {@link IPackageDeleteObserver} if the system failed to delete the package
   1205      * because it is the active DevicePolicy manager.
   1206      *
   1207      * @hide
   1208      */
   1209     public static final int DELETE_FAILED_DEVICE_POLICY_MANAGER = -2;
   1210 
   1211     /**
   1212      * Deletion failed return code: this is passed to the
   1213      * {@link IPackageDeleteObserver} if the system failed to delete the package
   1214      * since the user is restricted.
   1215      *
   1216      * @hide
   1217      */
   1218     public static final int DELETE_FAILED_USER_RESTRICTED = -3;
   1219 
   1220     /**
   1221      * Deletion failed return code: this is passed to the
   1222      * {@link IPackageDeleteObserver} if the system failed to delete the package
   1223      * because a profile or device owner has marked the package as
   1224      * uninstallable.
   1225      *
   1226      * @hide
   1227      */
   1228     public static final int DELETE_FAILED_OWNER_BLOCKED = -4;
   1229 
   1230     /** {@hide} */
   1231     public static final int DELETE_FAILED_ABORTED = -5;
   1232 
   1233     /**
   1234      * Return code that is passed to the {@link IPackageMoveObserver} when the
   1235      * package has been successfully moved by the system.
   1236      *
   1237      * @hide
   1238      */
   1239     public static final int MOVE_SUCCEEDED = -100;
   1240 
   1241     /**
   1242      * Error code that is passed to the {@link IPackageMoveObserver} when the
   1243      * package hasn't been successfully moved by the system because of
   1244      * insufficient memory on specified media.
   1245      *
   1246      * @hide
   1247      */
   1248     public static final int MOVE_FAILED_INSUFFICIENT_STORAGE = -1;
   1249 
   1250     /**
   1251      * Error code that is passed to the {@link IPackageMoveObserver} if the
   1252      * specified package doesn't exist.
   1253      *
   1254      * @hide
   1255      */
   1256     public static final int MOVE_FAILED_DOESNT_EXIST = -2;
   1257 
   1258     /**
   1259      * Error code that is passed to the {@link IPackageMoveObserver} if the
   1260      * specified package cannot be moved since its a system package.
   1261      *
   1262      * @hide
   1263      */
   1264     public static final int MOVE_FAILED_SYSTEM_PACKAGE = -3;
   1265 
   1266     /**
   1267      * Error code that is passed to the {@link IPackageMoveObserver} if the
   1268      * specified package cannot be moved since its forward locked.
   1269      *
   1270      * @hide
   1271      */
   1272     public static final int MOVE_FAILED_FORWARD_LOCKED = -4;
   1273 
   1274     /**
   1275      * Error code that is passed to the {@link IPackageMoveObserver} if the
   1276      * specified package cannot be moved to the specified location.
   1277      *
   1278      * @hide
   1279      */
   1280     public static final int MOVE_FAILED_INVALID_LOCATION = -5;
   1281 
   1282     /**
   1283      * Error code that is passed to the {@link IPackageMoveObserver} if the
   1284      * specified package cannot be moved to the specified location.
   1285      *
   1286      * @hide
   1287      */
   1288     public static final int MOVE_FAILED_INTERNAL_ERROR = -6;
   1289 
   1290     /**
   1291      * Error code that is passed to the {@link IPackageMoveObserver} if the
   1292      * specified package already has an operation pending in the queue.
   1293      *
   1294      * @hide
   1295      */
   1296     public static final int MOVE_FAILED_OPERATION_PENDING = -7;
   1297 
   1298     /**
   1299      * Error code that is passed to the {@link IPackageMoveObserver} if the
   1300      * specified package cannot be moved since it contains a device admin.
   1301      *
   1302      * @hide
   1303      */
   1304     public static final int MOVE_FAILED_DEVICE_ADMIN = -8;
   1305 
   1306     /**
   1307      * Flag parameter for {@link #movePackage} to indicate that
   1308      * the package should be moved to internal storage if its
   1309      * been installed on external media.
   1310      * @hide
   1311      */
   1312     @Deprecated
   1313     public static final int MOVE_INTERNAL = 0x00000001;
   1314 
   1315     /**
   1316      * Flag parameter for {@link #movePackage} to indicate that
   1317      * the package should be moved to external media.
   1318      * @hide
   1319      */
   1320     @Deprecated
   1321     public static final int MOVE_EXTERNAL_MEDIA = 0x00000002;
   1322 
   1323     /** {@hide} */
   1324     public static final String EXTRA_MOVE_ID = "android.content.pm.extra.MOVE_ID";
   1325 
   1326     /**
   1327      * Usable by the required verifier as the {@code verificationCode} argument
   1328      * for {@link PackageManager#verifyPendingInstall} to indicate that it will
   1329      * allow the installation to proceed without any of the optional verifiers
   1330      * needing to vote.
   1331      *
   1332      * @hide
   1333      */
   1334     public static final int VERIFICATION_ALLOW_WITHOUT_SUFFICIENT = 2;
   1335 
   1336     /**
   1337      * Used as the {@code verificationCode} argument for
   1338      * {@link PackageManager#verifyPendingInstall} to indicate that the calling
   1339      * package verifier allows the installation to proceed.
   1340      */
   1341     public static final int VERIFICATION_ALLOW = 1;
   1342 
   1343     /**
   1344      * Used as the {@code verificationCode} argument for
   1345      * {@link PackageManager#verifyPendingInstall} to indicate the calling
   1346      * package verifier does not vote to allow the installation to proceed.
   1347      */
   1348     public static final int VERIFICATION_REJECT = -1;
   1349 
   1350     /**
   1351      * Used as the {@code verificationCode} argument for
   1352      * {@link PackageManager#verifyIntentFilter} to indicate that the calling
   1353      * IntentFilter Verifier confirms that the IntentFilter is verified.
   1354      *
   1355      * @hide
   1356      */
   1357     @SystemApi
   1358     public static final int INTENT_FILTER_VERIFICATION_SUCCESS = 1;
   1359 
   1360     /**
   1361      * Used as the {@code verificationCode} argument for
   1362      * {@link PackageManager#verifyIntentFilter} to indicate that the calling
   1363      * IntentFilter Verifier confirms that the IntentFilter is NOT verified.
   1364      *
   1365      * @hide
   1366      */
   1367     @SystemApi
   1368     public static final int INTENT_FILTER_VERIFICATION_FAILURE = -1;
   1369 
   1370     /**
   1371      * Internal status code to indicate that an IntentFilter verification result is not specified.
   1372      *
   1373      * @hide
   1374      */
   1375     public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED = 0;
   1376 
   1377     /**
   1378      * Used as the {@code status} argument for
   1379      * {@link #updateIntentVerificationStatusAsUser} to indicate that the User
   1380      * will always be prompted the Intent Disambiguation Dialog if there are two
   1381      * or more Intent resolved for the IntentFilter's domain(s).
   1382      *
   1383      * @hide
   1384      */
   1385     public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK = 1;
   1386 
   1387     /**
   1388      * Used as the {@code status} argument for
   1389      * {@link #updateIntentVerificationStatusAsUser} to indicate that the User
   1390      * will never be prompted the Intent Disambiguation Dialog if there are two
   1391      * or more resolution of the Intent. The default App for the domain(s)
   1392      * specified in the IntentFilter will also ALWAYS be used.
   1393      *
   1394      * @hide
   1395      */
   1396     public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS = 2;
   1397 
   1398     /**
   1399      * Used as the {@code status} argument for
   1400      * {@link #updateIntentVerificationStatusAsUser} to indicate that the User
   1401      * may be prompted the Intent Disambiguation Dialog if there are two or more
   1402      * Intent resolved. The default App for the domain(s) specified in the
   1403      * IntentFilter will also NEVER be presented to the User.
   1404      *
   1405      * @hide
   1406      */
   1407     public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER = 3;
   1408 
   1409     /**
   1410      * Used as the {@code status} argument for
   1411      * {@link #updateIntentVerificationStatusAsUser} to indicate that this app
   1412      * should always be considered as an ambiguous candidate for handling the
   1413      * matching Intent even if there are other candidate apps in the "always"
   1414      * state. Put another way: if there are any 'always ask' apps in a set of
   1415      * more than one candidate app, then a disambiguation is *always* presented
   1416      * even if there is another candidate app with the 'always' state.
   1417      *
   1418      * @hide
   1419      */
   1420     public static final int INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK = 4;
   1421 
   1422     /**
   1423      * Can be used as the {@code millisecondsToDelay} argument for
   1424      * {@link PackageManager#extendVerificationTimeout}. This is the
   1425      * maximum time {@code PackageManager} waits for the verification
   1426      * agent to return (in milliseconds).
   1427      */
   1428     public static final long MAXIMUM_VERIFICATION_TIMEOUT = 60*60*1000;
   1429 
   1430     /**
   1431      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device's
   1432      * audio pipeline is low-latency, more suitable for audio applications sensitive to delays or
   1433      * lag in sound input or output.
   1434      */
   1435     @SdkConstant(SdkConstantType.FEATURE)
   1436     public static final String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
   1437 
   1438     /**
   1439      * Feature for {@link #getSystemAvailableFeatures} and
   1440      * {@link #hasSystemFeature}: The device includes at least one form of audio
   1441      * output, such as speakers, audio jack or streaming over bluetooth
   1442      */
   1443     @SdkConstant(SdkConstantType.FEATURE)
   1444     public static final String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output";
   1445 
   1446     /**
   1447      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   1448      * The device has professional audio level of functionality and performance.
   1449      */
   1450     @SdkConstant(SdkConstantType.FEATURE)
   1451     public static final String FEATURE_AUDIO_PRO = "android.hardware.audio.pro";
   1452 
   1453     /**
   1454      * Feature for {@link #getSystemAvailableFeatures} and
   1455      * {@link #hasSystemFeature}: The device is capable of communicating with
   1456      * other devices via Bluetooth.
   1457      */
   1458     @SdkConstant(SdkConstantType.FEATURE)
   1459     public static final String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
   1460 
   1461     /**
   1462      * Feature for {@link #getSystemAvailableFeatures} and
   1463      * {@link #hasSystemFeature}: The device is capable of communicating with
   1464      * other devices via Bluetooth Low Energy radio.
   1465      */
   1466     @SdkConstant(SdkConstantType.FEATURE)
   1467     public static final String FEATURE_BLUETOOTH_LE = "android.hardware.bluetooth_le";
   1468 
   1469     /**
   1470      * Feature for {@link #getSystemAvailableFeatures} and
   1471      * {@link #hasSystemFeature}: The device has a camera facing away
   1472      * from the screen.
   1473      */
   1474     @SdkConstant(SdkConstantType.FEATURE)
   1475     public static final String FEATURE_CAMERA = "android.hardware.camera";
   1476 
   1477     /**
   1478      * Feature for {@link #getSystemAvailableFeatures} and
   1479      * {@link #hasSystemFeature}: The device's camera supports auto-focus.
   1480      */
   1481     @SdkConstant(SdkConstantType.FEATURE)
   1482     public static final String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
   1483 
   1484     /**
   1485      * Feature for {@link #getSystemAvailableFeatures} and
   1486      * {@link #hasSystemFeature}: The device has at least one camera pointing in
   1487      * some direction, or can support an external camera being connected to it.
   1488      */
   1489     @SdkConstant(SdkConstantType.FEATURE)
   1490     public static final String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
   1491 
   1492     /**
   1493      * Feature for {@link #getSystemAvailableFeatures} and
   1494      * {@link #hasSystemFeature}: The device can support having an external camera connected to it.
   1495      * The external camera may not always be connected or available to applications to use.
   1496      */
   1497     @SdkConstant(SdkConstantType.FEATURE)
   1498     public static final String FEATURE_CAMERA_EXTERNAL = "android.hardware.camera.external";
   1499 
   1500     /**
   1501      * Feature for {@link #getSystemAvailableFeatures} and
   1502      * {@link #hasSystemFeature}: The device's camera supports flash.
   1503      */
   1504     @SdkConstant(SdkConstantType.FEATURE)
   1505     public static final String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
   1506 
   1507     /**
   1508      * Feature for {@link #getSystemAvailableFeatures} and
   1509      * {@link #hasSystemFeature}: The device has a front facing camera.
   1510      */
   1511     @SdkConstant(SdkConstantType.FEATURE)
   1512     public static final String FEATURE_CAMERA_FRONT = "android.hardware.camera.front";
   1513 
   1514     /**
   1515      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: At least one
   1516      * of the cameras on the device supports the
   1517      * {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL full hardware}
   1518      * capability level.
   1519      */
   1520     @SdkConstant(SdkConstantType.FEATURE)
   1521     public static final String FEATURE_CAMERA_LEVEL_FULL = "android.hardware.camera.level.full";
   1522 
   1523     /**
   1524      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: At least one
   1525      * of the cameras on the device supports the
   1526      * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR manual sensor}
   1527      * capability level.
   1528      */
   1529     @SdkConstant(SdkConstantType.FEATURE)
   1530     public static final String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR =
   1531             "android.hardware.camera.capability.manual_sensor";
   1532 
   1533     /**
   1534      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: At least one
   1535      * of the cameras on the device supports the
   1536      * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING manual post-processing}
   1537      * capability level.
   1538      */
   1539     @SdkConstant(SdkConstantType.FEATURE)
   1540     public static final String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING =
   1541             "android.hardware.camera.capability.manual_post_processing";
   1542 
   1543     /**
   1544      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: At least one
   1545      * of the cameras on the device supports the
   1546      * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_RAW RAW}
   1547      * capability level.
   1548      */
   1549     @SdkConstant(SdkConstantType.FEATURE)
   1550     public static final String FEATURE_CAMERA_CAPABILITY_RAW =
   1551             "android.hardware.camera.capability.raw";
   1552 
   1553     /**
   1554      * Feature for {@link #getSystemAvailableFeatures} and
   1555      * {@link #hasSystemFeature}: The device is capable of communicating with
   1556      * consumer IR devices.
   1557      */
   1558     @SdkConstant(SdkConstantType.FEATURE)
   1559     public static final String FEATURE_CONSUMER_IR = "android.hardware.consumerir";
   1560 
   1561     /**
   1562      * Feature for {@link #getSystemAvailableFeatures} and
   1563      * {@link #hasSystemFeature}: The device supports one or more methods of
   1564      * reporting current location.
   1565      */
   1566     @SdkConstant(SdkConstantType.FEATURE)
   1567     public static final String FEATURE_LOCATION = "android.hardware.location";
   1568 
   1569     /**
   1570      * Feature for {@link #getSystemAvailableFeatures} and
   1571      * {@link #hasSystemFeature}: The device has a Global Positioning System
   1572      * receiver and can report precise location.
   1573      */
   1574     @SdkConstant(SdkConstantType.FEATURE)
   1575     public static final String FEATURE_LOCATION_GPS = "android.hardware.location.gps";
   1576 
   1577     /**
   1578      * Feature for {@link #getSystemAvailableFeatures} and
   1579      * {@link #hasSystemFeature}: The device can report location with coarse
   1580      * accuracy using a network-based geolocation system.
   1581      */
   1582     @SdkConstant(SdkConstantType.FEATURE)
   1583     public static final String FEATURE_LOCATION_NETWORK = "android.hardware.location.network";
   1584 
   1585     /**
   1586      * Feature for {@link #getSystemAvailableFeatures} and
   1587      * {@link #hasSystemFeature}: The device can record audio via a
   1588      * microphone.
   1589      */
   1590     @SdkConstant(SdkConstantType.FEATURE)
   1591     public static final String FEATURE_MICROPHONE = "android.hardware.microphone";
   1592 
   1593     /**
   1594      * Feature for {@link #getSystemAvailableFeatures} and
   1595      * {@link #hasSystemFeature}: The device can communicate using Near-Field
   1596      * Communications (NFC).
   1597      */
   1598     @SdkConstant(SdkConstantType.FEATURE)
   1599     public static final String FEATURE_NFC = "android.hardware.nfc";
   1600 
   1601     /**
   1602      * Feature for {@link #getSystemAvailableFeatures} and
   1603      * {@link #hasSystemFeature}: The device supports host-
   1604      * based NFC card emulation.
   1605      *
   1606      * TODO remove when depending apps have moved to new constant.
   1607      * @hide
   1608      * @deprecated
   1609      */
   1610     @Deprecated
   1611     @SdkConstant(SdkConstantType.FEATURE)
   1612     public static final String FEATURE_NFC_HCE = "android.hardware.nfc.hce";
   1613 
   1614     /**
   1615      * Feature for {@link #getSystemAvailableFeatures} and
   1616      * {@link #hasSystemFeature}: The device supports host-
   1617      * based NFC card emulation.
   1618      */
   1619     @SdkConstant(SdkConstantType.FEATURE)
   1620     public static final String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
   1621 
   1622     /**
   1623      * Feature for {@link #getSystemAvailableFeatures} and
   1624      * {@link #hasSystemFeature}: The device supports host-
   1625      * based NFC-F card emulation.
   1626      */
   1627     @SdkConstant(SdkConstantType.FEATURE)
   1628     public static final String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
   1629 
   1630     /**
   1631      * Feature for {@link #getSystemAvailableFeatures} and
   1632      * {@link #hasSystemFeature}: The device supports the OpenGL ES
   1633      * <a href="http://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">
   1634      * Android Extension Pack</a>.
   1635      */
   1636     @SdkConstant(SdkConstantType.FEATURE)
   1637     public static final String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep";
   1638 
   1639     /**
   1640      * Feature for {@link #getSystemAvailableFeatures} and
   1641      * {@link #hasSystemFeature(String, int)}: If this feature is supported, the Vulkan native API
   1642      * will enumerate at least one {@code VkPhysicalDevice}, and the feature version will indicate
   1643      * what level of optional hardware features limits it supports.
   1644      * <p>
   1645      * Level 0 includes the base Vulkan requirements as well as:
   1646      * <ul><li>{@code VkPhysicalDeviceFeatures::textureCompressionETC2}</li></ul>
   1647      * <p>
   1648      * Level 1 additionally includes:
   1649      * <ul>
   1650      * <li>{@code VkPhysicalDeviceFeatures::fullDrawIndexUint32}</li>
   1651      * <li>{@code VkPhysicalDeviceFeatures::imageCubeArray}</li>
   1652      * <li>{@code VkPhysicalDeviceFeatures::independentBlend}</li>
   1653      * <li>{@code VkPhysicalDeviceFeatures::geometryShader}</li>
   1654      * <li>{@code VkPhysicalDeviceFeatures::tessellationShader}</li>
   1655      * <li>{@code VkPhysicalDeviceFeatures::sampleRateShading}</li>
   1656      * <li>{@code VkPhysicalDeviceFeatures::textureCompressionASTC_LDR}</li>
   1657      * <li>{@code VkPhysicalDeviceFeatures::fragmentStoresAndAtomics}</li>
   1658      * <li>{@code VkPhysicalDeviceFeatures::shaderImageGatherExtended}</li>
   1659      * <li>{@code VkPhysicalDeviceFeatures::shaderUniformBufferArrayDynamicIndexing}</li>
   1660      * <li>{@code VkPhysicalDeviceFeatures::shaderSampledImageArrayDynamicIndexing}</li>
   1661      * </ul>
   1662      */
   1663     @SdkConstant(SdkConstantType.FEATURE)
   1664     public static final String FEATURE_VULKAN_HARDWARE_LEVEL = "android.hardware.vulkan.level";
   1665 
   1666     /**
   1667      * Feature for {@link #getSystemAvailableFeatures} and
   1668      * {@link #hasSystemFeature(String, int)}: The version of this feature indicates the highest
   1669      * {@code VkPhysicalDeviceProperties::apiVersion} supported by the physical devices that support
   1670      * the hardware level indicated by {@link #FEATURE_VULKAN_HARDWARE_LEVEL}. The feature version
   1671      * uses the same encoding as Vulkan version numbers:
   1672      * <ul>
   1673      * <li>Major version number in bits 31-22</li>
   1674      * <li>Minor version number in bits 21-12</li>
   1675      * <li>Patch version number in bits 11-0</li>
   1676      * </ul>
   1677      */
   1678     @SdkConstant(SdkConstantType.FEATURE)
   1679     public static final String FEATURE_VULKAN_HARDWARE_VERSION = "android.hardware.vulkan.version";
   1680 
   1681     /**
   1682      * Feature for {@link #getSystemAvailableFeatures} and
   1683      * {@link #hasSystemFeature}: The device includes an accelerometer.
   1684      */
   1685     @SdkConstant(SdkConstantType.FEATURE)
   1686     public static final String FEATURE_SENSOR_ACCELEROMETER = "android.hardware.sensor.accelerometer";
   1687 
   1688     /**
   1689      * Feature for {@link #getSystemAvailableFeatures} and
   1690      * {@link #hasSystemFeature}: The device includes a barometer (air
   1691      * pressure sensor.)
   1692      */
   1693     @SdkConstant(SdkConstantType.FEATURE)
   1694     public static final String FEATURE_SENSOR_BAROMETER = "android.hardware.sensor.barometer";
   1695 
   1696     /**
   1697      * Feature for {@link #getSystemAvailableFeatures} and
   1698      * {@link #hasSystemFeature}: The device includes a magnetometer (compass).
   1699      */
   1700     @SdkConstant(SdkConstantType.FEATURE)
   1701     public static final String FEATURE_SENSOR_COMPASS = "android.hardware.sensor.compass";
   1702 
   1703     /**
   1704      * Feature for {@link #getSystemAvailableFeatures} and
   1705      * {@link #hasSystemFeature}: The device includes a gyroscope.
   1706      */
   1707     @SdkConstant(SdkConstantType.FEATURE)
   1708     public static final String FEATURE_SENSOR_GYROSCOPE = "android.hardware.sensor.gyroscope";
   1709 
   1710     /**
   1711      * Feature for {@link #getSystemAvailableFeatures} and
   1712      * {@link #hasSystemFeature}: The device includes a light sensor.
   1713      */
   1714     @SdkConstant(SdkConstantType.FEATURE)
   1715     public static final String FEATURE_SENSOR_LIGHT = "android.hardware.sensor.light";
   1716 
   1717     /**
   1718      * Feature for {@link #getSystemAvailableFeatures} and
   1719      * {@link #hasSystemFeature}: The device includes a proximity sensor.
   1720      */
   1721     @SdkConstant(SdkConstantType.FEATURE)
   1722     public static final String FEATURE_SENSOR_PROXIMITY = "android.hardware.sensor.proximity";
   1723 
   1724     /**
   1725      * Feature for {@link #getSystemAvailableFeatures} and
   1726      * {@link #hasSystemFeature}: The device includes a hardware step counter.
   1727      */
   1728     @SdkConstant(SdkConstantType.FEATURE)
   1729     public static final String FEATURE_SENSOR_STEP_COUNTER = "android.hardware.sensor.stepcounter";
   1730 
   1731     /**
   1732      * Feature for {@link #getSystemAvailableFeatures} and
   1733      * {@link #hasSystemFeature}: The device includes a hardware step detector.
   1734      */
   1735     @SdkConstant(SdkConstantType.FEATURE)
   1736     public static final String FEATURE_SENSOR_STEP_DETECTOR = "android.hardware.sensor.stepdetector";
   1737 
   1738     /**
   1739      * Feature for {@link #getSystemAvailableFeatures} and
   1740      * {@link #hasSystemFeature}: The device includes a heart rate monitor.
   1741      */
   1742     @SdkConstant(SdkConstantType.FEATURE)
   1743     public static final String FEATURE_SENSOR_HEART_RATE = "android.hardware.sensor.heartrate";
   1744 
   1745     /**
   1746      * Feature for {@link #getSystemAvailableFeatures} and
   1747      * {@link #hasSystemFeature}: The heart rate sensor on this device is an Electrocardiogram.
   1748      */
   1749     @SdkConstant(SdkConstantType.FEATURE)
   1750     public static final String FEATURE_SENSOR_HEART_RATE_ECG =
   1751             "android.hardware.sensor.heartrate.ecg";
   1752 
   1753     /**
   1754      * Feature for {@link #getSystemAvailableFeatures} and
   1755      * {@link #hasSystemFeature}: The device includes a relative humidity sensor.
   1756      */
   1757     @SdkConstant(SdkConstantType.FEATURE)
   1758     public static final String FEATURE_SENSOR_RELATIVE_HUMIDITY =
   1759             "android.hardware.sensor.relative_humidity";
   1760 
   1761     /**
   1762      * Feature for {@link #getSystemAvailableFeatures} and
   1763      * {@link #hasSystemFeature}: The device includes an ambient temperature sensor.
   1764      */
   1765     @SdkConstant(SdkConstantType.FEATURE)
   1766     public static final String FEATURE_SENSOR_AMBIENT_TEMPERATURE =
   1767             "android.hardware.sensor.ambient_temperature";
   1768 
   1769     /**
   1770      * Feature for {@link #getSystemAvailableFeatures} and
   1771      * {@link #hasSystemFeature}: The device supports high fidelity sensor processing
   1772      * capabilities.
   1773      */
   1774     @SdkConstant(SdkConstantType.FEATURE)
   1775     public static final String FEATURE_HIFI_SENSORS =
   1776             "android.hardware.sensor.hifi_sensors";
   1777 
   1778     /**
   1779      * Feature for {@link #getSystemAvailableFeatures} and
   1780      * {@link #hasSystemFeature}: The device has a telephony radio with data
   1781      * communication support.
   1782      */
   1783     @SdkConstant(SdkConstantType.FEATURE)
   1784     public static final String FEATURE_TELEPHONY = "android.hardware.telephony";
   1785 
   1786     /**
   1787      * Feature for {@link #getSystemAvailableFeatures} and
   1788      * {@link #hasSystemFeature}: The device has a CDMA telephony stack.
   1789      */
   1790     @SdkConstant(SdkConstantType.FEATURE)
   1791     public static final String FEATURE_TELEPHONY_CDMA = "android.hardware.telephony.cdma";
   1792 
   1793     /**
   1794      * Feature for {@link #getSystemAvailableFeatures} and
   1795      * {@link #hasSystemFeature}: The device has a GSM telephony stack.
   1796      */
   1797     @SdkConstant(SdkConstantType.FEATURE)
   1798     public static final String FEATURE_TELEPHONY_GSM = "android.hardware.telephony.gsm";
   1799 
   1800     /**
   1801      * Feature for {@link #getSystemAvailableFeatures} and
   1802      * {@link #hasSystemFeature}: The device supports connecting to USB devices
   1803      * as the USB host.
   1804      */
   1805     @SdkConstant(SdkConstantType.FEATURE)
   1806     public static final String FEATURE_USB_HOST = "android.hardware.usb.host";
   1807 
   1808     /**
   1809      * Feature for {@link #getSystemAvailableFeatures} and
   1810      * {@link #hasSystemFeature}: The device supports connecting to USB accessories.
   1811      */
   1812     @SdkConstant(SdkConstantType.FEATURE)
   1813     public static final String FEATURE_USB_ACCESSORY = "android.hardware.usb.accessory";
   1814 
   1815     /**
   1816      * Feature for {@link #getSystemAvailableFeatures} and
   1817      * {@link #hasSystemFeature}: The SIP API is enabled on the device.
   1818      */
   1819     @SdkConstant(SdkConstantType.FEATURE)
   1820     public static final String FEATURE_SIP = "android.software.sip";
   1821 
   1822     /**
   1823      * Feature for {@link #getSystemAvailableFeatures} and
   1824      * {@link #hasSystemFeature}: The device supports SIP-based VOIP.
   1825      */
   1826     @SdkConstant(SdkConstantType.FEATURE)
   1827     public static final String FEATURE_SIP_VOIP = "android.software.sip.voip";
   1828 
   1829     /**
   1830      * Feature for {@link #getSystemAvailableFeatures} and
   1831      * {@link #hasSystemFeature}: The Connection Service API is enabled on the device.
   1832      */
   1833     @SdkConstant(SdkConstantType.FEATURE)
   1834     public static final String FEATURE_CONNECTION_SERVICE = "android.software.connectionservice";
   1835 
   1836     /**
   1837      * Feature for {@link #getSystemAvailableFeatures} and
   1838      * {@link #hasSystemFeature}: The device's display has a touch screen.
   1839      */
   1840     @SdkConstant(SdkConstantType.FEATURE)
   1841     public static final String FEATURE_TOUCHSCREEN = "android.hardware.touchscreen";
   1842 
   1843     /**
   1844      * Feature for {@link #getSystemAvailableFeatures} and
   1845      * {@link #hasSystemFeature}: The device's touch screen supports
   1846      * multitouch sufficient for basic two-finger gesture detection.
   1847      */
   1848     @SdkConstant(SdkConstantType.FEATURE)
   1849     public static final String FEATURE_TOUCHSCREEN_MULTITOUCH = "android.hardware.touchscreen.multitouch";
   1850 
   1851     /**
   1852      * Feature for {@link #getSystemAvailableFeatures} and
   1853      * {@link #hasSystemFeature}: The device's touch screen is capable of
   1854      * tracking two or more fingers fully independently.
   1855      */
   1856     @SdkConstant(SdkConstantType.FEATURE)
   1857     public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT = "android.hardware.touchscreen.multitouch.distinct";
   1858 
   1859     /**
   1860      * Feature for {@link #getSystemAvailableFeatures} and
   1861      * {@link #hasSystemFeature}: The device's touch screen is capable of
   1862      * tracking a full hand of fingers fully independently -- that is, 5 or
   1863      * more simultaneous independent pointers.
   1864      */
   1865     @SdkConstant(SdkConstantType.FEATURE)
   1866     public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND = "android.hardware.touchscreen.multitouch.jazzhand";
   1867 
   1868     /**
   1869      * Feature for {@link #getSystemAvailableFeatures} and
   1870      * {@link #hasSystemFeature}: The device does not have a touch screen, but
   1871      * does support touch emulation for basic events. For instance, the
   1872      * device might use a mouse or remote control to drive a cursor, and
   1873      * emulate basic touch pointer events like down, up, drag, etc. All
   1874      * devices that support android.hardware.touchscreen or a sub-feature are
   1875      * presumed to also support faketouch.
   1876      */
   1877     @SdkConstant(SdkConstantType.FEATURE)
   1878     public static final String FEATURE_FAKETOUCH = "android.hardware.faketouch";
   1879 
   1880     /**
   1881      * Feature for {@link #getSystemAvailableFeatures} and
   1882      * {@link #hasSystemFeature}: The device does not have a touch screen, but
   1883      * does support touch emulation for basic events that supports distinct
   1884      * tracking of two or more fingers.  This is an extension of
   1885      * {@link #FEATURE_FAKETOUCH} for input devices with this capability.  Note
   1886      * that unlike a distinct multitouch screen as defined by
   1887      * {@link #FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT}, these kinds of input
   1888      * devices will not actually provide full two-finger gestures since the
   1889      * input is being transformed to cursor movement on the screen.  That is,
   1890      * single finger gestures will move a cursor; two-finger swipes will
   1891      * result in single-finger touch events; other two-finger gestures will
   1892      * result in the corresponding two-finger touch event.
   1893      */
   1894     @SdkConstant(SdkConstantType.FEATURE)
   1895     public static final String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct";
   1896 
   1897     /**
   1898      * Feature for {@link #getSystemAvailableFeatures} and
   1899      * {@link #hasSystemFeature}: The device does not have a touch screen, but
   1900      * does support touch emulation for basic events that supports tracking
   1901      * a hand of fingers (5 or more fingers) fully independently.
   1902      * This is an extension of
   1903      * {@link #FEATURE_FAKETOUCH} for input devices with this capability.  Note
   1904      * that unlike a multitouch screen as defined by
   1905      * {@link #FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND}, not all two finger
   1906      * gestures can be detected due to the limitations described for
   1907      * {@link #FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT}.
   1908      */
   1909     @SdkConstant(SdkConstantType.FEATURE)
   1910     public static final String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND = "android.hardware.faketouch.multitouch.jazzhand";
   1911 
   1912     /**
   1913      * Feature for {@link #getSystemAvailableFeatures} and
   1914      * {@link #hasSystemFeature}: The device has biometric hardware to detect a fingerprint.
   1915       */
   1916     @SdkConstant(SdkConstantType.FEATURE)
   1917     public static final String FEATURE_FINGERPRINT = "android.hardware.fingerprint";
   1918 
   1919     /**
   1920      * Feature for {@link #getSystemAvailableFeatures} and
   1921      * {@link #hasSystemFeature}: The device supports portrait orientation
   1922      * screens.  For backwards compatibility, you can assume that if neither
   1923      * this nor {@link #FEATURE_SCREEN_LANDSCAPE} is set then the device supports
   1924      * both portrait and landscape.
   1925      */
   1926     @SdkConstant(SdkConstantType.FEATURE)
   1927     public static final String FEATURE_SCREEN_PORTRAIT = "android.hardware.screen.portrait";
   1928 
   1929     /**
   1930      * Feature for {@link #getSystemAvailableFeatures} and
   1931      * {@link #hasSystemFeature}: The device supports landscape orientation
   1932      * screens.  For backwards compatibility, you can assume that if neither
   1933      * this nor {@link #FEATURE_SCREEN_PORTRAIT} is set then the device supports
   1934      * both portrait and landscape.
   1935      */
   1936     @SdkConstant(SdkConstantType.FEATURE)
   1937     public static final String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
   1938 
   1939     /**
   1940      * Feature for {@link #getSystemAvailableFeatures} and
   1941      * {@link #hasSystemFeature}: The device supports live wallpapers.
   1942      */
   1943     @SdkConstant(SdkConstantType.FEATURE)
   1944     public static final String FEATURE_LIVE_WALLPAPER = "android.software.live_wallpaper";
   1945     /**
   1946      * Feature for {@link #getSystemAvailableFeatures} and
   1947      * {@link #hasSystemFeature}: The device supports app widgets.
   1948      */
   1949     @SdkConstant(SdkConstantType.FEATURE)
   1950     public static final String FEATURE_APP_WIDGETS = "android.software.app_widgets";
   1951 
   1952     /**
   1953      * @hide
   1954      * Feature for {@link #getSystemAvailableFeatures} and
   1955      * {@link #hasSystemFeature}: The device supports
   1956      * {@link android.service.voice.VoiceInteractionService} and
   1957      * {@link android.app.VoiceInteractor}.
   1958      */
   1959     @SdkConstant(SdkConstantType.FEATURE)
   1960     public static final String FEATURE_VOICE_RECOGNIZERS = "android.software.voice_recognizers";
   1961 
   1962 
   1963     /**
   1964      * Feature for {@link #getSystemAvailableFeatures} and
   1965      * {@link #hasSystemFeature}: The device supports a home screen that is replaceable
   1966      * by third party applications.
   1967      */
   1968     @SdkConstant(SdkConstantType.FEATURE)
   1969     public static final String FEATURE_HOME_SCREEN = "android.software.home_screen";
   1970 
   1971     /**
   1972      * Feature for {@link #getSystemAvailableFeatures} and
   1973      * {@link #hasSystemFeature}: The device supports adding new input methods implemented
   1974      * with the {@link android.inputmethodservice.InputMethodService} API.
   1975      */
   1976     @SdkConstant(SdkConstantType.FEATURE)
   1977     public static final String FEATURE_INPUT_METHODS = "android.software.input_methods";
   1978 
   1979     /**
   1980      * Feature for {@link #getSystemAvailableFeatures} and
   1981      * {@link #hasSystemFeature}: The device supports device policy enforcement via device admins.
   1982      */
   1983     @SdkConstant(SdkConstantType.FEATURE)
   1984     public static final String FEATURE_DEVICE_ADMIN = "android.software.device_admin";
   1985 
   1986     /**
   1987      * Feature for {@link #getSystemAvailableFeatures} and
   1988      * {@link #hasSystemFeature}: The device supports leanback UI. This is
   1989      * typically used in a living room television experience, but is a software
   1990      * feature unlike {@link #FEATURE_TELEVISION}. Devices running with this
   1991      * feature will use resources associated with the "television" UI mode.
   1992      */
   1993     @SdkConstant(SdkConstantType.FEATURE)
   1994     public static final String FEATURE_LEANBACK = "android.software.leanback";
   1995 
   1996     /**
   1997      * Feature for {@link #getSystemAvailableFeatures} and
   1998      * {@link #hasSystemFeature}: The device supports only leanback UI. Only
   1999      * applications designed for this experience should be run, though this is
   2000      * not enforced by the system.
   2001      * @hide
   2002      */
   2003     @SdkConstant(SdkConstantType.FEATURE)
   2004     public static final String FEATURE_LEANBACK_ONLY = "android.software.leanback_only";
   2005 
   2006     /**
   2007      * Feature for {@link #getSystemAvailableFeatures} and
   2008      * {@link #hasSystemFeature}: The device supports live TV and can display
   2009      * contents from TV inputs implemented with the
   2010      * {@link android.media.tv.TvInputService} API.
   2011      */
   2012     @SdkConstant(SdkConstantType.FEATURE)
   2013     public static final String FEATURE_LIVE_TV = "android.software.live_tv";
   2014 
   2015     /**
   2016      * Feature for {@link #getSystemAvailableFeatures} and
   2017      * {@link #hasSystemFeature}: The device supports WiFi (802.11) networking.
   2018      */
   2019     @SdkConstant(SdkConstantType.FEATURE)
   2020     public static final String FEATURE_WIFI = "android.hardware.wifi";
   2021 
   2022     /**
   2023      * Feature for {@link #getSystemAvailableFeatures} and
   2024      * {@link #hasSystemFeature}: The device supports Wi-Fi Direct networking.
   2025      */
   2026     @SdkConstant(SdkConstantType.FEATURE)
   2027     public static final String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
   2028 
   2029     /**
   2030      * Feature for {@link #getSystemAvailableFeatures} and
   2031      * {@link #hasSystemFeature}: The device supports Wi-Fi Aware (NAN)
   2032      * networking.
   2033      *
   2034      * @hide PROPOSED_NAN_API
   2035      */
   2036     @SdkConstant(SdkConstantType.FEATURE)
   2037     public static final String FEATURE_WIFI_NAN = "android.hardware.wifi.nan";
   2038 
   2039     /**
   2040      * Feature for {@link #getSystemAvailableFeatures} and
   2041      * {@link #hasSystemFeature}: This is a device dedicated to showing UI
   2042      * on a vehicle headunit. A headunit here is defined to be inside a
   2043      * vehicle that may or may not be moving. A headunit uses either a
   2044      * primary display in the center console and/or additional displays in
   2045      * the instrument cluster or elsewhere in the vehicle. Headunit display(s)
   2046      * have limited size and resolution. The user will likely be focused on
   2047      * driving so limiting driver distraction is a primary concern. User input
   2048      * can be a variety of hard buttons, touch, rotary controllers and even mouse-
   2049      * like interfaces.
   2050      */
   2051     @SdkConstant(SdkConstantType.FEATURE)
   2052     public static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
   2053 
   2054     /**
   2055      * Feature for {@link #getSystemAvailableFeatures} and
   2056      * {@link #hasSystemFeature}: This is a device dedicated to showing UI
   2057      * on a television.  Television here is defined to be a typical living
   2058      * room television experience: displayed on a big screen, where the user
   2059      * is sitting far away from it, and the dominant form of input will be
   2060      * something like a DPAD, not through touch or mouse.
   2061      * @deprecated use {@link #FEATURE_LEANBACK} instead.
   2062      */
   2063     @Deprecated
   2064     @SdkConstant(SdkConstantType.FEATURE)
   2065     public static final String FEATURE_TELEVISION = "android.hardware.type.television";
   2066 
   2067     /**
   2068      * Feature for {@link #getSystemAvailableFeatures} and
   2069      * {@link #hasSystemFeature}: This is a device dedicated to showing UI
   2070      * on a watch. A watch here is defined to be a device worn on the body, perhaps on
   2071      * the wrist. The user is very close when interacting with the device.
   2072      */
   2073     @SdkConstant(SdkConstantType.FEATURE)
   2074     public static final String FEATURE_WATCH = "android.hardware.type.watch";
   2075 
   2076     /**
   2077      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2078      * The device supports printing.
   2079      */
   2080     @SdkConstant(SdkConstantType.FEATURE)
   2081     public static final String FEATURE_PRINTING = "android.software.print";
   2082 
   2083     /**
   2084      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2085      * The device can perform backup and restore operations on installed applications.
   2086      */
   2087     @SdkConstant(SdkConstantType.FEATURE)
   2088     public static final String FEATURE_BACKUP = "android.software.backup";
   2089 
   2090     /**
   2091      * Feature for {@link #getSystemAvailableFeatures} and
   2092      * {@link #hasSystemFeature}: The device supports freeform window management.
   2093      * Windows have title bars and can be moved and resized.
   2094      */
   2095     // If this feature is present, you also need to set
   2096     // com.android.internal.R.config_freeformWindowManagement to true in your configuration overlay.
   2097     @SdkConstant(SdkConstantType.FEATURE)
   2098     public static final String FEATURE_FREEFORM_WINDOW_MANAGEMENT
   2099             = "android.software.freeform_window_management";
   2100 
   2101     /**
   2102      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2103      * The device supports picture-in-picture multi-window mode.
   2104      */
   2105     @SdkConstant(SdkConstantType.FEATURE)
   2106     public static final String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture";
   2107 
   2108     /**
   2109      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2110      * The device supports creating secondary users and managed profiles via
   2111      * {@link DevicePolicyManager}.
   2112      */
   2113     @SdkConstant(SdkConstantType.FEATURE)
   2114     public static final String FEATURE_MANAGED_USERS = "android.software.managed_users";
   2115 
   2116     /**
   2117      * @hide
   2118      * TODO: Remove after dependencies updated b/17392243
   2119      */
   2120     public static final String FEATURE_MANAGED_PROFILES = "android.software.managed_users";
   2121 
   2122     /**
   2123      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2124      * The device supports verified boot.
   2125      */
   2126     @SdkConstant(SdkConstantType.FEATURE)
   2127     public static final String FEATURE_VERIFIED_BOOT = "android.software.verified_boot";
   2128 
   2129     /**
   2130      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2131      * The device supports secure removal of users. When a user is deleted the data associated
   2132      * with that user is securely deleted and no longer available.
   2133      */
   2134     @SdkConstant(SdkConstantType.FEATURE)
   2135     public static final String FEATURE_SECURELY_REMOVES_USERS
   2136             = "android.software.securely_removes_users";
   2137 
   2138     /** {@hide} */
   2139     @SdkConstant(SdkConstantType.FEATURE)
   2140     public static final String FEATURE_FILE_BASED_ENCRYPTION
   2141             = "android.software.file_based_encryption";
   2142 
   2143     /**
   2144      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2145      * The device has a full implementation of the android.webkit.* APIs. Devices
   2146      * lacking this feature will not have a functioning WebView implementation.
   2147      */
   2148     @SdkConstant(SdkConstantType.FEATURE)
   2149     public static final String FEATURE_WEBVIEW = "android.software.webview";
   2150 
   2151     /**
   2152      * Feature for {@link #getSystemAvailableFeatures} and
   2153      * {@link #hasSystemFeature}: This device supports ethernet.
   2154      */
   2155     @SdkConstant(SdkConstantType.FEATURE)
   2156     public static final String FEATURE_ETHERNET = "android.hardware.ethernet";
   2157 
   2158     /**
   2159      * Feature for {@link #getSystemAvailableFeatures} and
   2160      * {@link #hasSystemFeature}: This device supports HDMI-CEC.
   2161      * @hide
   2162      */
   2163     @SdkConstant(SdkConstantType.FEATURE)
   2164     public static final String FEATURE_HDMI_CEC = "android.hardware.hdmi.cec";
   2165 
   2166     /**
   2167      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2168      * The device has all of the inputs necessary to be considered a compatible game controller, or
   2169      * includes a compatible game controller in the box.
   2170      */
   2171     @SdkConstant(SdkConstantType.FEATURE)
   2172     public static final String FEATURE_GAMEPAD = "android.hardware.gamepad";
   2173 
   2174     /**
   2175      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2176      * The device has a full implementation of the android.media.midi.* APIs.
   2177      */
   2178     @SdkConstant(SdkConstantType.FEATURE)
   2179     public static final String FEATURE_MIDI = "android.software.midi";
   2180 
   2181     /**
   2182      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2183      * The device implements an optimized mode for virtual reality (VR) applications that handles
   2184      * stereoscopic rendering of notifications, and disables most monocular system UI components
   2185      * while a VR application has user focus.
   2186      * Devices declaring this feature must include an application implementing a
   2187      * {@link android.service.vr.VrListenerService} that can be targeted by VR applications via
   2188      * {@link android.app.Activity#setVrModeEnabled}.
   2189      */
   2190     @SdkConstant(SdkConstantType.FEATURE)
   2191     public static final String FEATURE_VR_MODE = "android.software.vr.mode";
   2192 
   2193     /**
   2194      * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
   2195      * The device implements {@link #FEATURE_VR_MODE} but additionally meets extra CDD requirements
   2196      * to provide a high-quality VR experience.  In general, devices declaring this feature will
   2197      * additionally:
   2198      * <ul>
   2199      *   <li>Deliver consistent performance at a high framerate over an extended period of time
   2200      *   for typical VR application CPU/GPU workloads with a minimal number of frame drops for VR
   2201      *   applications that have called
   2202      *   {@link android.view.Window#setSustainedPerformanceMode}.</li>
   2203      *   <li>Implement {@link #FEATURE_HIFI_SENSORS} and have a low sensor latency.</li>
   2204      *   <li>Include optimizations to lower display persistence while running VR applications.</li>
   2205      *   <li>Implement an optimized render path to minimize latency to draw to the device's main
   2206      *   display.</li>
   2207      *   <li>Include the following EGL extensions: EGL_ANDROID_create_native_client_buffer,
   2208      *   EGL_ANDROID_front_buffer_auto_refresh, EGL_EXT_protected_content,
   2209      *   EGL_KHR_mutable_render_buffer, EGL_KHR_reusable_sync, and EGL_KHR_wait_sync.</li>
   2210      *   <li>Provide at least one CPU core that is reserved for use solely by the top, foreground
   2211      *   VR application process for critical render threads while such an application is
   2212      *   running.</li>
   2213      * </ul>
   2214      */
   2215     @SdkConstant(SdkConstantType.FEATURE)
   2216     public static final String FEATURE_VR_MODE_HIGH_PERFORMANCE
   2217             = "android.hardware.vr.high_performance";
   2218 
   2219     /**
   2220      * Action to external storage service to clean out removed apps.
   2221      * @hide
   2222      */
   2223     public static final String ACTION_CLEAN_EXTERNAL_STORAGE
   2224             = "android.content.pm.CLEAN_EXTERNAL_STORAGE";
   2225 
   2226     /**
   2227      * Extra field name for the URI to a verification file. Passed to a package
   2228      * verifier.
   2229      *
   2230      * @hide
   2231      */
   2232     public static final String EXTRA_VERIFICATION_URI = "android.content.pm.extra.VERIFICATION_URI";
   2233 
   2234     /**
   2235      * Extra field name for the ID of a package pending verification. Passed to
   2236      * a package verifier and is used to call back to
   2237      * {@link PackageManager#verifyPendingInstall(int, int)}
   2238      */
   2239     public static final String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
   2240 
   2241     /**
   2242      * Extra field name for the package identifier which is trying to install
   2243      * the package.
   2244      *
   2245      * @hide
   2246      */
   2247     public static final String EXTRA_VERIFICATION_INSTALLER_PACKAGE
   2248             = "android.content.pm.extra.VERIFICATION_INSTALLER_PACKAGE";
   2249 
   2250     /**
   2251      * Extra field name for the requested install flags for a package pending
   2252      * verification. Passed to a package verifier.
   2253      *
   2254      * @hide
   2255      */
   2256     public static final String EXTRA_VERIFICATION_INSTALL_FLAGS
   2257             = "android.content.pm.extra.VERIFICATION_INSTALL_FLAGS";
   2258 
   2259     /**
   2260      * Extra field name for the uid of who is requesting to install
   2261      * the package.
   2262      *
   2263      * @hide
   2264      */
   2265     public static final String EXTRA_VERIFICATION_INSTALLER_UID
   2266             = "android.content.pm.extra.VERIFICATION_INSTALLER_UID";
   2267 
   2268     /**
   2269      * Extra field name for the package name of a package pending verification.
   2270      *
   2271      * @hide
   2272      */
   2273     public static final String EXTRA_VERIFICATION_PACKAGE_NAME
   2274             = "android.content.pm.extra.VERIFICATION_PACKAGE_NAME";
   2275     /**
   2276      * Extra field name for the result of a verification, either
   2277      * {@link #VERIFICATION_ALLOW}, or {@link #VERIFICATION_REJECT}.
   2278      * Passed to package verifiers after a package is verified.
   2279      */
   2280     public static final String EXTRA_VERIFICATION_RESULT
   2281             = "android.content.pm.extra.VERIFICATION_RESULT";
   2282 
   2283     /**
   2284      * Extra field name for the version code of a package pending verification.
   2285      *
   2286      * @hide
   2287      */
   2288     public static final String EXTRA_VERIFICATION_VERSION_CODE
   2289             = "android.content.pm.extra.VERIFICATION_VERSION_CODE";
   2290 
   2291     /**
   2292      * Extra field name for the ID of a intent filter pending verification.
   2293      * Passed to an intent filter verifier and is used to call back to
   2294      * {@link #verifyIntentFilter}
   2295      *
   2296      * @hide
   2297      */
   2298     public static final String EXTRA_INTENT_FILTER_VERIFICATION_ID
   2299             = "android.content.pm.extra.INTENT_FILTER_VERIFICATION_ID";
   2300 
   2301     /**
   2302      * Extra field name for the scheme used for an intent filter pending verification. Passed to
   2303      * an intent filter verifier and is used to construct the URI to verify against.
   2304      *
   2305      * Usually this is "https"
   2306      *
   2307      * @hide
   2308      */
   2309     public static final String EXTRA_INTENT_FILTER_VERIFICATION_URI_SCHEME
   2310             = "android.content.pm.extra.INTENT_FILTER_VERIFICATION_URI_SCHEME";
   2311 
   2312     /**
   2313      * Extra field name for the host names to be used for an intent filter pending verification.
   2314      * Passed to an intent filter verifier and is used to construct the URI to verify the
   2315      * intent filter.
   2316      *
   2317      * This is a space delimited list of hosts.
   2318      *
   2319      * @hide
   2320      */
   2321     public static final String EXTRA_INTENT_FILTER_VERIFICATION_HOSTS
   2322             = "android.content.pm.extra.INTENT_FILTER_VERIFICATION_HOSTS";
   2323 
   2324     /**
   2325      * Extra field name for the package name to be used for an intent filter pending verification.
   2326      * Passed to an intent filter verifier and is used to check the verification responses coming
   2327      * from the hosts. Each host response will need to include the package name of APK containing
   2328      * the intent filter.
   2329      *
   2330      * @hide
   2331      */
   2332     public static final String EXTRA_INTENT_FILTER_VERIFICATION_PACKAGE_NAME
   2333             = "android.content.pm.extra.INTENT_FILTER_VERIFICATION_PACKAGE_NAME";
   2334 
   2335     /**
   2336      * The action used to request that the user approve a permission request
   2337      * from the application.
   2338      *
   2339      * @hide
   2340      */
   2341     @SystemApi
   2342     public static final String ACTION_REQUEST_PERMISSIONS =
   2343             "android.content.pm.action.REQUEST_PERMISSIONS";
   2344 
   2345     /**
   2346      * The names of the requested permissions.
   2347      * <p>
   2348      * <strong>Type:</strong> String[]
   2349      * </p>
   2350      *
   2351      * @hide
   2352      */
   2353     @SystemApi
   2354     public static final String EXTRA_REQUEST_PERMISSIONS_NAMES =
   2355             "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
   2356 
   2357     /**
   2358      * The results from the permissions request.
   2359      * <p>
   2360      * <strong>Type:</strong> int[] of #PermissionResult
   2361      * </p>
   2362      *
   2363      * @hide
   2364      */
   2365     @SystemApi
   2366     public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS
   2367             = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
   2368 
   2369     /**
   2370      * String extra for {@link PackageInstallObserver} in the 'extras' Bundle in case of
   2371      * {@link #INSTALL_FAILED_DUPLICATE_PERMISSION}.  This extra names the package which provides
   2372      * the existing definition for the permission.
   2373      * @hide
   2374      */
   2375     public static final String EXTRA_FAILURE_EXISTING_PACKAGE
   2376             = "android.content.pm.extra.FAILURE_EXISTING_PACKAGE";
   2377 
   2378     /**
   2379      * String extra for {@link PackageInstallObserver} in the 'extras' Bundle in case of
   2380      * {@link #INSTALL_FAILED_DUPLICATE_PERMISSION}.  This extra names the permission that is
   2381      * being redundantly defined by the package being installed.
   2382      * @hide
   2383      */
   2384     public static final String EXTRA_FAILURE_EXISTING_PERMISSION
   2385             = "android.content.pm.extra.FAILURE_EXISTING_PERMISSION";
   2386 
   2387    /**
   2388     * Permission flag: The permission is set in its current state
   2389     * by the user and apps can still request it at runtime.
   2390     *
   2391     * @hide
   2392     */
   2393     @SystemApi
   2394     public static final int FLAG_PERMISSION_USER_SET = 1 << 0;
   2395 
   2396     /**
   2397      * Permission flag: The permission is set in its current state
   2398      * by the user and it is fixed, i.e. apps can no longer request
   2399      * this permission.
   2400      *
   2401      * @hide
   2402      */
   2403     @SystemApi
   2404     public static final int FLAG_PERMISSION_USER_FIXED =  1 << 1;
   2405 
   2406     /**
   2407      * Permission flag: The permission is set in its current state
   2408      * by device policy and neither apps nor the user can change
   2409      * its state.
   2410      *
   2411      * @hide
   2412      */
   2413     @SystemApi
   2414     public static final int FLAG_PERMISSION_POLICY_FIXED =  1 << 2;
   2415 
   2416     /**
   2417      * Permission flag: The permission is set in a granted state but
   2418      * access to resources it guards is restricted by other means to
   2419      * enable revoking a permission on legacy apps that do not support
   2420      * runtime permissions. If this permission is upgraded to runtime
   2421      * because the app was updated to support runtime permissions, the
   2422      * the permission will be revoked in the upgrade process.
   2423      *
   2424      * @hide
   2425      */
   2426     @SystemApi
   2427     public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE =  1 << 3;
   2428 
   2429     /**
   2430      * Permission flag: The permission is set in its current state
   2431      * because the app is a component that is a part of the system.
   2432      *
   2433      * @hide
   2434      */
   2435     @SystemApi
   2436     public static final int FLAG_PERMISSION_SYSTEM_FIXED =  1 << 4;
   2437 
   2438     /**
   2439      * Permission flag: The permission is granted by default because it
   2440      * enables app functionality that is expected to work out-of-the-box
   2441      * for providing a smooth user experience. For example, the phone app
   2442      * is expected to have the phone permission.
   2443      *
   2444      * @hide
   2445      */
   2446     @SystemApi
   2447     public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT =  1 << 5;
   2448 
   2449     /**
   2450      * Permission flag: The permission has to be reviewed before any of
   2451      * the app components can run.
   2452      *
   2453      * @hide
   2454      */
   2455     @SystemApi
   2456     public static final int FLAG_PERMISSION_REVIEW_REQUIRED =  1 << 6;
   2457 
   2458     /**
   2459      * Mask for all permission flags.
   2460      *
   2461      * @hide
   2462      */
   2463     @SystemApi
   2464     public static final int MASK_PERMISSION_FLAGS = 0xFF;
   2465 
   2466     /**
   2467      * This is a library that contains components apps can invoke. For
   2468      * example, a services for apps to bind to, or standard chooser UI,
   2469      * etc. This library is versioned and backwards compatible. Clients
   2470      * should check its version via {@link android.ext.services.Version
   2471      * #getVersionCode()} and avoid calling APIs added in later versions.
   2472      *
   2473      * @hide
   2474      */
   2475     public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services";
   2476 
   2477     /**
   2478      * This is a library that contains components apps can dynamically
   2479      * load. For example, new widgets, helper classes, etc. This library
   2480      * is versioned and backwards compatible. Clients should check its
   2481      * version via {@link android.ext.shared.Version#getVersionCode()}
   2482      * and avoid calling APIs added in later versions.
   2483      *
   2484      * @hide
   2485      */
   2486     public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared";
   2487 
   2488     /**
   2489      * Used when starting a process for an Activity.
   2490      *
   2491      * @hide
   2492      */
   2493     public static final int NOTIFY_PACKAGE_USE_ACTIVITY = 0;
   2494 
   2495     /**
   2496      * Used when starting a process for a Service.
   2497      *
   2498      * @hide
   2499      */
   2500     public static final int NOTIFY_PACKAGE_USE_SERVICE = 1;
   2501 
   2502     /**
   2503      * Used when moving a Service to the foreground.
   2504      *
   2505      * @hide
   2506      */
   2507     public static final int NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE = 2;
   2508 
   2509     /**
   2510      * Used when starting a process for a BroadcastReceiver.
   2511      *
   2512      * @hide
   2513      */
   2514     public static final int NOTIFY_PACKAGE_USE_BROADCAST_RECEIVER = 3;
   2515 
   2516     /**
   2517      * Used when starting a process for a ContentProvider.
   2518      *
   2519      * @hide
   2520      */
   2521     public static final int NOTIFY_PACKAGE_USE_CONTENT_PROVIDER = 4;
   2522 
   2523     /**
   2524      * Used when starting a process for a BroadcastReceiver.
   2525      *
   2526      * @hide
   2527      */
   2528     public static final int NOTIFY_PACKAGE_USE_BACKUP = 5;
   2529 
   2530     /**
   2531      * Used with Context.getClassLoader() across Android packages.
   2532      *
   2533      * @hide
   2534      */
   2535     public static final int NOTIFY_PACKAGE_USE_CROSS_PACKAGE = 6;
   2536 
   2537     /**
   2538      * Used when starting a package within a process for Instrumentation.
   2539      *
   2540      * @hide
   2541      */
   2542     public static final int NOTIFY_PACKAGE_USE_INSTRUMENTATION = 7;
   2543 
   2544     /**
   2545      * Total number of usage reasons.
   2546      *
   2547      * @hide
   2548      */
   2549     public static final int NOTIFY_PACKAGE_USE_REASONS_COUNT = 8;
   2550 
   2551     /**
   2552      * Retrieve overall information about an application package that is
   2553      * installed on the system.
   2554      *
   2555      * @param packageName The full name (i.e. com.google.apps.contacts) of the
   2556      *         desired package.
   2557      * @param flags Additional option flags. Use any combination of
   2558      *         {@link #GET_ACTIVITIES}, {@link #GET_CONFIGURATIONS},
   2559      *         {@link #GET_GIDS}, {@link #GET_INSTRUMENTATION},
   2560      *         {@link #GET_INTENT_FILTERS}, {@link #GET_META_DATA},
   2561      *         {@link #GET_PERMISSIONS}, {@link #GET_PROVIDERS},
   2562      *         {@link #GET_RECEIVERS}, {@link #GET_SERVICES},
   2563      *         {@link #GET_SHARED_LIBRARY_FILES}, {@link #GET_SIGNATURES},
   2564      *         {@link #GET_URI_PERMISSION_PATTERNS}, {@link #GET_UNINSTALLED_PACKAGES},
   2565      *         {@link #MATCH_DISABLED_COMPONENTS}, {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   2566      *         {@link #MATCH_UNINSTALLED_PACKAGES}
   2567      *         to modify the data returned.
   2568      *
   2569      * @return A PackageInfo object containing information about the
   2570      *         package. If flag {@code MATCH_UNINSTALLED_PACKAGES} is set and if the
   2571      *         package is not found in the list of installed applications, the
   2572      *         package information is retrieved from the list of uninstalled
   2573      *         applications (which includes installed applications as well as
   2574      *         applications with data directory i.e. applications which had been
   2575      *         deleted with {@code DONT_DELETE_DATA} flag set).
   2576      * @throws NameNotFoundException if a package with the given name cannot be
   2577      *             found on the system.
   2578      * @see #GET_ACTIVITIES
   2579      * @see #GET_CONFIGURATIONS
   2580      * @see #GET_GIDS
   2581      * @see #GET_INSTRUMENTATION
   2582      * @see #GET_INTENT_FILTERS
   2583      * @see #GET_META_DATA
   2584      * @see #GET_PERMISSIONS
   2585      * @see #GET_PROVIDERS
   2586      * @see #GET_RECEIVERS
   2587      * @see #GET_SERVICES
   2588      * @see #GET_SHARED_LIBRARY_FILES
   2589      * @see #GET_SIGNATURES
   2590      * @see #GET_URI_PERMISSION_PATTERNS
   2591      * @see #MATCH_DISABLED_COMPONENTS
   2592      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   2593      * @see #MATCH_UNINSTALLED_PACKAGES
   2594      */
   2595     public abstract PackageInfo getPackageInfo(String packageName, @PackageInfoFlags int flags)
   2596             throws NameNotFoundException;
   2597 
   2598     /**
   2599      * @hide
   2600      * Retrieve overall information about an application package that is
   2601      * installed on the system.
   2602      *
   2603      * @param packageName The full name (i.e. com.google.apps.contacts) of the
   2604      *         desired package.
   2605      * @param flags Additional option flags. Use any combination of
   2606      *         {@link #GET_ACTIVITIES}, {@link #GET_CONFIGURATIONS},
   2607      *         {@link #GET_GIDS}, {@link #GET_INSTRUMENTATION},
   2608      *         {@link #GET_INTENT_FILTERS}, {@link #GET_META_DATA},
   2609      *         {@link #GET_PERMISSIONS}, {@link #GET_PROVIDERS},
   2610      *         {@link #GET_RECEIVERS}, {@link #GET_SERVICES},
   2611      *         {@link #GET_SHARED_LIBRARY_FILES}, {@link #GET_SIGNATURES},
   2612      *         {@link #GET_URI_PERMISSION_PATTERNS}, {@link #GET_UNINSTALLED_PACKAGES},
   2613      *         {@link #MATCH_DISABLED_COMPONENTS}, {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   2614      *         {@link #MATCH_UNINSTALLED_PACKAGES}
   2615      *         to modify the data returned.
   2616      * @param userId The user id.
   2617      *
   2618      * @return A PackageInfo object containing information about the
   2619      *         package. If flag {@code MATCH_UNINSTALLED_PACKAGES} is set and if the
   2620      *         package is not found in the list of installed applications, the
   2621      *         package information is retrieved from the list of uninstalled
   2622      *         applications (which includes installed applications as well as
   2623      *         applications with data directory i.e. applications which had been
   2624      *         deleted with {@code DONT_DELETE_DATA} flag set).
   2625      * @throws NameNotFoundException if a package with the given name cannot be
   2626      *             found on the system.
   2627      * @see #GET_ACTIVITIES
   2628      * @see #GET_CONFIGURATIONS
   2629      * @see #GET_GIDS
   2630      * @see #GET_INSTRUMENTATION
   2631      * @see #GET_INTENT_FILTERS
   2632      * @see #GET_META_DATA
   2633      * @see #GET_PERMISSIONS
   2634      * @see #GET_PROVIDERS
   2635      * @see #GET_RECEIVERS
   2636      * @see #GET_SERVICES
   2637      * @see #GET_SHARED_LIBRARY_FILES
   2638      * @see #GET_SIGNATURES
   2639      * @see #GET_URI_PERMISSION_PATTERNS
   2640      * @see #MATCH_DISABLED_COMPONENTS
   2641      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   2642      * @see #MATCH_UNINSTALLED_PACKAGES
   2643      */
   2644     @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS)
   2645     public abstract PackageInfo getPackageInfoAsUser(String packageName,
   2646             @PackageInfoFlags int flags, @UserIdInt int userId) throws NameNotFoundException;
   2647 
   2648     /**
   2649      * Map from the current package names in use on the device to whatever
   2650      * the current canonical name of that package is.
   2651      * @param names Array of current names to be mapped.
   2652      * @return Returns an array of the same size as the original, containing
   2653      * the canonical name for each package.
   2654      */
   2655     public abstract String[] currentToCanonicalPackageNames(String[] names);
   2656 
   2657     /**
   2658      * Map from a packages canonical name to the current name in use on the device.
   2659      * @param names Array of new names to be mapped.
   2660      * @return Returns an array of the same size as the original, containing
   2661      * the current name for each package.
   2662      */
   2663     public abstract String[] canonicalToCurrentPackageNames(String[] names);
   2664 
   2665     /**
   2666      * Returns a "good" intent to launch a front-door activity in a package.
   2667      * This is used, for example, to implement an "open" button when browsing
   2668      * through packages.  The current implementation looks first for a main
   2669      * activity in the category {@link Intent#CATEGORY_INFO}, and next for a
   2670      * main activity in the category {@link Intent#CATEGORY_LAUNCHER}. Returns
   2671      * <code>null</code> if neither are found.
   2672      *
   2673      * @param packageName The name of the package to inspect.
   2674      *
   2675      * @return A fully-qualified {@link Intent} that can be used to launch the
   2676      * main activity in the package. Returns <code>null</code> if the package
   2677      * does not contain such an activity, or if <em>packageName</em> is not
   2678      * recognized.
   2679      */
   2680     public abstract Intent getLaunchIntentForPackage(String packageName);
   2681 
   2682     /**
   2683      * Return a "good" intent to launch a front-door Leanback activity in a
   2684      * package, for use for example to implement an "open" button when browsing
   2685      * through packages. The current implementation will look for a main
   2686      * activity in the category {@link Intent#CATEGORY_LEANBACK_LAUNCHER}, or
   2687      * return null if no main leanback activities are found.
   2688      *
   2689      * @param packageName The name of the package to inspect.
   2690      * @return Returns either a fully-qualified Intent that can be used to launch
   2691      *         the main Leanback activity in the package, or null if the package
   2692      *         does not contain such an activity.
   2693      */
   2694     public abstract Intent getLeanbackLaunchIntentForPackage(String packageName);
   2695 
   2696     /**
   2697      * Return an array of all of the POSIX secondary group IDs that have been
   2698      * assigned to the given package.
   2699      * <p>
   2700      * Note that the same package may have different GIDs under different
   2701      * {@link UserHandle} on the same device.
   2702      *
   2703      * @param packageName The full name (i.e. com.google.apps.contacts) of the
   2704      *            desired package.
   2705      * @return Returns an int array of the assigned GIDs, or null if there are
   2706      *         none.
   2707      * @throws NameNotFoundException if a package with the given name cannot be
   2708      *             found on the system.
   2709      */
   2710     public abstract int[] getPackageGids(String packageName)
   2711             throws NameNotFoundException;
   2712 
   2713     /**
   2714      * Return an array of all of the POSIX secondary group IDs that have been
   2715      * assigned to the given package.
   2716      * <p>
   2717      * Note that the same package may have different GIDs under different
   2718      * {@link UserHandle} on the same device.
   2719      *
   2720      * @param packageName The full name (i.e. com.google.apps.contacts) of the
   2721      *            desired package.
   2722      * @return Returns an int array of the assigned gids, or null if there are
   2723      *         none.
   2724      * @throws NameNotFoundException if a package with the given name cannot be
   2725      *             found on the system.
   2726      */
   2727     public abstract int[] getPackageGids(String packageName, @PackageInfoFlags int flags)
   2728             throws NameNotFoundException;
   2729 
   2730     /**
   2731      * Return the UID associated with the given package name.
   2732      * <p>
   2733      * Note that the same package will have different UIDs under different
   2734      * {@link UserHandle} on the same device.
   2735      *
   2736      * @param packageName The full name (i.e. com.google.apps.contacts) of the
   2737      *            desired package.
   2738      * @return Returns an integer UID who owns the given package name.
   2739      * @throws NameNotFoundException if a package with the given name can not be
   2740      *             found on the system.
   2741      */
   2742     public abstract int getPackageUid(String packageName, @PackageInfoFlags int flags)
   2743             throws NameNotFoundException;
   2744 
   2745     /**
   2746      * Return the UID associated with the given package name.
   2747      * <p>
   2748      * Note that the same package will have different UIDs under different
   2749      * {@link UserHandle} on the same device.
   2750      *
   2751      * @param packageName The full name (i.e. com.google.apps.contacts) of the
   2752      *            desired package.
   2753      * @param userId The user handle identifier to look up the package under.
   2754      * @return Returns an integer UID who owns the given package name.
   2755      * @throws NameNotFoundException if a package with the given name can not be
   2756      *             found on the system.
   2757      * @hide
   2758      */
   2759     public abstract int getPackageUidAsUser(String packageName, @UserIdInt int userId)
   2760             throws NameNotFoundException;
   2761 
   2762     /**
   2763      * Return the UID associated with the given package name.
   2764      * <p>
   2765      * Note that the same package will have different UIDs under different
   2766      * {@link UserHandle} on the same device.
   2767      *
   2768      * @param packageName The full name (i.e. com.google.apps.contacts) of the
   2769      *            desired package.
   2770      * @param userId The user handle identifier to look up the package under.
   2771      * @return Returns an integer UID who owns the given package name.
   2772      * @throws NameNotFoundException if a package with the given name can not be
   2773      *             found on the system.
   2774      * @hide
   2775      */
   2776     public abstract int getPackageUidAsUser(String packageName, @PackageInfoFlags int flags,
   2777             @UserIdInt int userId) throws NameNotFoundException;
   2778 
   2779     /**
   2780      * Retrieve all of the information we know about a particular permission.
   2781      *
   2782      * @param name The fully qualified name (i.e. com.google.permission.LOGIN)
   2783      *         of the permission you are interested in.
   2784      * @param flags Additional option flags.  Use {@link #GET_META_DATA} to
   2785      *         retrieve any meta-data associated with the permission.
   2786      *
   2787      * @return Returns a {@link PermissionInfo} containing information about the
   2788      *         permission.
   2789      * @throws NameNotFoundException if a package with the given name cannot be
   2790      *             found on the system.
   2791      *
   2792      * @see #GET_META_DATA
   2793      */
   2794     public abstract PermissionInfo getPermissionInfo(String name, @PermissionInfoFlags int flags)
   2795             throws NameNotFoundException;
   2796 
   2797     /**
   2798      * Query for all of the permissions associated with a particular group.
   2799      *
   2800      * @param group The fully qualified name (i.e. com.google.permission.LOGIN)
   2801      *         of the permission group you are interested in.  Use null to
   2802      *         find all of the permissions not associated with a group.
   2803      * @param flags Additional option flags.  Use {@link #GET_META_DATA} to
   2804      *         retrieve any meta-data associated with the permissions.
   2805      *
   2806      * @return Returns a list of {@link PermissionInfo} containing information
   2807      *             about all of the permissions in the given group.
   2808      * @throws NameNotFoundException if a package with the given name cannot be
   2809      *             found on the system.
   2810      *
   2811      * @see #GET_META_DATA
   2812      */
   2813     public abstract List<PermissionInfo> queryPermissionsByGroup(String group,
   2814             @PermissionInfoFlags int flags) throws NameNotFoundException;
   2815 
   2816     /**
   2817      * Retrieve all of the information we know about a particular group of
   2818      * permissions.
   2819      *
   2820      * @param name The fully qualified name (i.e. com.google.permission_group.APPS)
   2821      *         of the permission you are interested in.
   2822      * @param flags Additional option flags.  Use {@link #GET_META_DATA} to
   2823      *         retrieve any meta-data associated with the permission group.
   2824      *
   2825      * @return Returns a {@link PermissionGroupInfo} containing information
   2826      *         about the permission.
   2827      * @throws NameNotFoundException if a package with the given name cannot be
   2828      *             found on the system.
   2829      *
   2830      * @see #GET_META_DATA
   2831      */
   2832     public abstract PermissionGroupInfo getPermissionGroupInfo(String name,
   2833             @PermissionGroupInfoFlags int flags) throws NameNotFoundException;
   2834 
   2835     /**
   2836      * Retrieve all of the known permission groups in the system.
   2837      *
   2838      * @param flags Additional option flags.  Use {@link #GET_META_DATA} to
   2839      *         retrieve any meta-data associated with the permission group.
   2840      *
   2841      * @return Returns a list of {@link PermissionGroupInfo} containing
   2842      *         information about all of the known permission groups.
   2843      *
   2844      * @see #GET_META_DATA
   2845      */
   2846     public abstract List<PermissionGroupInfo> getAllPermissionGroups(
   2847             @PermissionGroupInfoFlags int flags);
   2848 
   2849     /**
   2850      * Retrieve all of the information we know about a particular
   2851      * package/application.
   2852      *
   2853      * @param packageName The full name (i.e. com.google.apps.contacts) of an
   2854      *         application.
   2855      * @param flags Additional option flags. Use any combination of
   2856      *         {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   2857      *         {@link #MATCH_SYSTEM_ONLY}, {@link #MATCH_UNINSTALLED_PACKAGES}
   2858      *         to modify the data returned.
   2859      *
   2860      * @return An {@link ApplicationInfo} containing information about the
   2861      *         package. If flag {@code MATCH_UNINSTALLED_PACKAGES} is set and if the
   2862      *         package is not found in the list of installed applications, the
   2863      *         application information is retrieved from the list of uninstalled
   2864      *         applications (which includes installed applications as well as
   2865      *         applications with data directory i.e. applications which had been
   2866      *         deleted with {@code DONT_DELETE_DATA} flag set).
   2867      * @throws NameNotFoundException if a package with the given name cannot be
   2868      *             found on the system.
   2869      *
   2870      * @see #GET_META_DATA
   2871      * @see #GET_SHARED_LIBRARY_FILES
   2872      * @see #MATCH_SYSTEM_ONLY
   2873      * @see #MATCH_UNINSTALLED_PACKAGES
   2874      */
   2875     public abstract ApplicationInfo getApplicationInfo(String packageName,
   2876             @ApplicationInfoFlags int flags) throws NameNotFoundException;
   2877 
   2878     /** {@hide} */
   2879     public abstract ApplicationInfo getApplicationInfoAsUser(String packageName,
   2880             @ApplicationInfoFlags int flags, @UserIdInt int userId) throws NameNotFoundException;
   2881 
   2882     /**
   2883      * Retrieve all of the information we know about a particular activity
   2884      * class.
   2885      *
   2886      * @param component The full component name (i.e.
   2887      *            com.google.apps.contacts/com.google.apps.contacts.
   2888      *            ContactsList) of an Activity class.
   2889      * @param flags Additional option flags. Use any combination of
   2890      *            {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   2891      *            {@link #MATCH_ALL}, {@link #MATCH_DEFAULT_ONLY},
   2892      *            {@link #MATCH_DISABLED_COMPONENTS},
   2893      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   2894      *            {@link #MATCH_DIRECT_BOOT_AWARE},
   2895      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   2896      *            {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   2897      *            returned.
   2898      * @return An {@link ActivityInfo} containing information about the
   2899      *         activity.
   2900      * @throws NameNotFoundException if a package with the given name cannot be
   2901      *             found on the system.
   2902      * @see #GET_META_DATA
   2903      * @see #GET_SHARED_LIBRARY_FILES
   2904      * @see #MATCH_ALL
   2905      * @see #MATCH_DEBUG_TRIAGED_MISSING
   2906      * @see #MATCH_DEFAULT_ONLY
   2907      * @see #MATCH_DISABLED_COMPONENTS
   2908      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   2909      * @see #MATCH_DIRECT_BOOT_AWARE
   2910      * @see #MATCH_DIRECT_BOOT_UNAWARE
   2911      * @see #MATCH_SYSTEM_ONLY
   2912      * @see #MATCH_UNINSTALLED_PACKAGES
   2913      */
   2914     public abstract ActivityInfo getActivityInfo(ComponentName component,
   2915             @ComponentInfoFlags int flags) throws NameNotFoundException;
   2916 
   2917     /**
   2918      * Retrieve all of the information we know about a particular receiver
   2919      * class.
   2920      *
   2921      * @param component The full component name (i.e.
   2922      *            com.google.apps.calendar/com.google.apps.calendar.
   2923      *            CalendarAlarm) of a Receiver class.
   2924      * @param flags Additional option flags. Use any combination of
   2925      *            {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   2926      *            {@link #MATCH_ALL}, {@link #MATCH_DEFAULT_ONLY},
   2927      *            {@link #MATCH_DISABLED_COMPONENTS},
   2928      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   2929      *            {@link #MATCH_DIRECT_BOOT_AWARE},
   2930      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   2931      *            {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   2932      *            returned.
   2933      * @return An {@link ActivityInfo} containing information about the
   2934      *         receiver.
   2935      * @throws NameNotFoundException if a package with the given name cannot be
   2936      *             found on the system.
   2937      * @see #GET_META_DATA
   2938      * @see #GET_SHARED_LIBRARY_FILES
   2939      * @see #MATCH_ALL
   2940      * @see #MATCH_DEBUG_TRIAGED_MISSING
   2941      * @see #MATCH_DEFAULT_ONLY
   2942      * @see #MATCH_DISABLED_COMPONENTS
   2943      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   2944      * @see #MATCH_DIRECT_BOOT_AWARE
   2945      * @see #MATCH_DIRECT_BOOT_UNAWARE
   2946      * @see #MATCH_SYSTEM_ONLY
   2947      * @see #MATCH_UNINSTALLED_PACKAGES
   2948      */
   2949     public abstract ActivityInfo getReceiverInfo(ComponentName component,
   2950             @ComponentInfoFlags int flags) throws NameNotFoundException;
   2951 
   2952     /**
   2953      * Retrieve all of the information we know about a particular service class.
   2954      *
   2955      * @param component The full component name (i.e.
   2956      *            com.google.apps.media/com.google.apps.media.
   2957      *            BackgroundPlayback) of a Service class.
   2958      * @param flags Additional option flags. Use any combination of
   2959      *            {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   2960      *            {@link #MATCH_ALL}, {@link #MATCH_DEFAULT_ONLY},
   2961      *            {@link #MATCH_DISABLED_COMPONENTS},
   2962      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   2963      *            {@link #MATCH_DIRECT_BOOT_AWARE},
   2964      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   2965      *            {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   2966      *            returned.
   2967      * @return A {@link ServiceInfo} object containing information about the
   2968      *         service.
   2969      * @throws NameNotFoundException if a package with the given name cannot be
   2970      *             found on the system.
   2971      * @see #GET_META_DATA
   2972      * @see #GET_SHARED_LIBRARY_FILES
   2973      * @see #MATCH_ALL
   2974      * @see #MATCH_DEBUG_TRIAGED_MISSING
   2975      * @see #MATCH_DEFAULT_ONLY
   2976      * @see #MATCH_DISABLED_COMPONENTS
   2977      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   2978      * @see #MATCH_DIRECT_BOOT_AWARE
   2979      * @see #MATCH_DIRECT_BOOT_UNAWARE
   2980      * @see #MATCH_SYSTEM_ONLY
   2981      * @see #MATCH_UNINSTALLED_PACKAGES
   2982      */
   2983     public abstract ServiceInfo getServiceInfo(ComponentName component,
   2984             @ComponentInfoFlags int flags) throws NameNotFoundException;
   2985 
   2986     /**
   2987      * Retrieve all of the information we know about a particular content
   2988      * provider class.
   2989      *
   2990      * @param component The full component name (i.e.
   2991      *            com.google.providers.media/com.google.providers.media.
   2992      *            MediaProvider) of a ContentProvider class.
   2993      * @param flags Additional option flags. Use any combination of
   2994      *            {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   2995      *            {@link #MATCH_ALL}, {@link #MATCH_DEFAULT_ONLY},
   2996      *            {@link #MATCH_DISABLED_COMPONENTS},
   2997      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   2998      *            {@link #MATCH_DIRECT_BOOT_AWARE},
   2999      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3000      *            {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3001      *            returned.
   3002      * @return A {@link ProviderInfo} object containing information about the
   3003      *         provider.
   3004      * @throws NameNotFoundException if a package with the given name cannot be
   3005      *             found on the system.
   3006      * @see #GET_META_DATA
   3007      * @see #GET_SHARED_LIBRARY_FILES
   3008      * @see #MATCH_ALL
   3009      * @see #MATCH_DEBUG_TRIAGED_MISSING
   3010      * @see #MATCH_DEFAULT_ONLY
   3011      * @see #MATCH_DISABLED_COMPONENTS
   3012      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3013      * @see #MATCH_DIRECT_BOOT_AWARE
   3014      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3015      * @see #MATCH_SYSTEM_ONLY
   3016      * @see #MATCH_UNINSTALLED_PACKAGES
   3017      */
   3018     public abstract ProviderInfo getProviderInfo(ComponentName component,
   3019             @ComponentInfoFlags int flags) throws NameNotFoundException;
   3020 
   3021     /**
   3022      * Return a List of all packages that are installed
   3023      * on the device.
   3024      *
   3025      * @param flags Additional option flags. Use any combination of
   3026      *         {@link #GET_ACTIVITIES}, {@link #GET_CONFIGURATIONS},
   3027      *         {@link #GET_GIDS}, {@link #GET_INSTRUMENTATION},
   3028      *         {@link #GET_INTENT_FILTERS}, {@link #GET_META_DATA},
   3029      *         {@link #GET_PERMISSIONS}, {@link #GET_PROVIDERS},
   3030      *         {@link #GET_RECEIVERS}, {@link #GET_SERVICES},
   3031      *         {@link #GET_SHARED_LIBRARY_FILES}, {@link #GET_SIGNATURES},
   3032      *         {@link #GET_URI_PERMISSION_PATTERNS}, {@link #GET_UNINSTALLED_PACKAGES},
   3033      *         {@link #MATCH_DISABLED_COMPONENTS}, {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3034      *         {@link #MATCH_UNINSTALLED_PACKAGES}
   3035      *         to modify the data returned.
   3036      *
   3037      * @return A List of PackageInfo objects, one for each installed package,
   3038      *         containing information about the package.  In the unlikely case
   3039      *         there are no installed packages, an empty list is returned. If
   3040      *         flag {@code MATCH_UNINSTALLED_PACKAGES} is set, the package
   3041      *         information is retrieved from the list of uninstalled
   3042      *         applications (which includes installed applications as well as
   3043      *         applications with data directory i.e. applications which had been
   3044      *         deleted with {@code DONT_DELETE_DATA} flag set).
   3045      *
   3046      * @see #GET_ACTIVITIES
   3047      * @see #GET_CONFIGURATIONS
   3048      * @see #GET_GIDS
   3049      * @see #GET_INSTRUMENTATION
   3050      * @see #GET_INTENT_FILTERS
   3051      * @see #GET_META_DATA
   3052      * @see #GET_PERMISSIONS
   3053      * @see #GET_PROVIDERS
   3054      * @see #GET_RECEIVERS
   3055      * @see #GET_SERVICES
   3056      * @see #GET_SHARED_LIBRARY_FILES
   3057      * @see #GET_SIGNATURES
   3058      * @see #GET_URI_PERMISSION_PATTERNS
   3059      * @see #MATCH_DISABLED_COMPONENTS
   3060      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3061      * @see #MATCH_UNINSTALLED_PACKAGES
   3062      */
   3063     public abstract List<PackageInfo> getInstalledPackages(@PackageInfoFlags int flags);
   3064 
   3065     /**
   3066      * Return a List of all installed packages that are currently
   3067      * holding any of the given permissions.
   3068      *
   3069      * @param flags Additional option flags. Use any combination of
   3070      *         {@link #GET_ACTIVITIES}, {@link #GET_CONFIGURATIONS},
   3071      *         {@link #GET_GIDS}, {@link #GET_INSTRUMENTATION},
   3072      *         {@link #GET_INTENT_FILTERS}, {@link #GET_META_DATA},
   3073      *         {@link #GET_PERMISSIONS}, {@link #GET_PROVIDERS},
   3074      *         {@link #GET_RECEIVERS}, {@link #GET_SERVICES},
   3075      *         {@link #GET_SHARED_LIBRARY_FILES}, {@link #GET_SIGNATURES},
   3076      *         {@link #GET_URI_PERMISSION_PATTERNS}, {@link #GET_UNINSTALLED_PACKAGES},
   3077      *         {@link #MATCH_DISABLED_COMPONENTS}, {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3078      *         {@link #MATCH_UNINSTALLED_PACKAGES}
   3079      *         to modify the data returned.
   3080      *
   3081      * @return A List of PackageInfo objects, one for each installed package
   3082      *         that holds any of the permissions that were provided, containing
   3083      *         information about the package. If no installed packages hold any
   3084      *         of the permissions, an empty list is returned. If flag
   3085      *         {@code MATCH_UNINSTALLED_PACKAGES} is set, the package information
   3086      *         is retrieved from the list of uninstalled applications (which
   3087      *         includes installed applications as well as applications with data
   3088      *         directory i.e. applications which had been deleted with
   3089      *         {@code DONT_DELETE_DATA} flag set).
   3090      *
   3091      * @see #GET_ACTIVITIES
   3092      * @see #GET_CONFIGURATIONS
   3093      * @see #GET_GIDS
   3094      * @see #GET_INSTRUMENTATION
   3095      * @see #GET_INTENT_FILTERS
   3096      * @see #GET_META_DATA
   3097      * @see #GET_PERMISSIONS
   3098      * @see #GET_PROVIDERS
   3099      * @see #GET_RECEIVERS
   3100      * @see #GET_SERVICES
   3101      * @see #GET_SHARED_LIBRARY_FILES
   3102      * @see #GET_SIGNATURES
   3103      * @see #GET_URI_PERMISSION_PATTERNS
   3104      * @see #MATCH_DISABLED_COMPONENTS
   3105      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3106      * @see #MATCH_UNINSTALLED_PACKAGES
   3107      */
   3108     public abstract List<PackageInfo> getPackagesHoldingPermissions(
   3109             String[] permissions, @PackageInfoFlags int flags);
   3110 
   3111     /**
   3112      * Return a List of all packages that are installed on the device, for a specific user.
   3113      * Requesting a list of installed packages for another user
   3114      * will require the permission INTERACT_ACROSS_USERS_FULL.
   3115      *
   3116      * @param flags Additional option flags. Use any combination of
   3117      *         {@link #GET_ACTIVITIES}, {@link #GET_CONFIGURATIONS},
   3118      *         {@link #GET_GIDS}, {@link #GET_INSTRUMENTATION},
   3119      *         {@link #GET_INTENT_FILTERS}, {@link #GET_META_DATA},
   3120      *         {@link #GET_PERMISSIONS}, {@link #GET_PROVIDERS},
   3121      *         {@link #GET_RECEIVERS}, {@link #GET_SERVICES},
   3122      *         {@link #GET_SHARED_LIBRARY_FILES}, {@link #GET_SIGNATURES},
   3123      *         {@link #GET_URI_PERMISSION_PATTERNS}, {@link #GET_UNINSTALLED_PACKAGES},
   3124      *         {@link #MATCH_DISABLED_COMPONENTS}, {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3125      *         {@link #MATCH_UNINSTALLED_PACKAGES}
   3126      *         to modify the data returned.
   3127      * @param userId The user for whom the installed packages are to be listed
   3128      *
   3129      * @return A List of PackageInfo objects, one for each installed package,
   3130      *         containing information about the package.  In the unlikely case
   3131      *         there are no installed packages, an empty list is returned. If
   3132      *         flag {@code MATCH_UNINSTALLED_PACKAGES} is set, the package
   3133      *         information is retrieved from the list of uninstalled
   3134      *         applications (which includes installed applications as well as
   3135      *         applications with data directory i.e. applications which had been
   3136      *         deleted with {@code DONT_DELETE_DATA} flag set).
   3137      *
   3138      * @see #GET_ACTIVITIES
   3139      * @see #GET_CONFIGURATIONS
   3140      * @see #GET_GIDS
   3141      * @see #GET_INSTRUMENTATION
   3142      * @see #GET_INTENT_FILTERS
   3143      * @see #GET_META_DATA
   3144      * @see #GET_PERMISSIONS
   3145      * @see #GET_PROVIDERS
   3146      * @see #GET_RECEIVERS
   3147      * @see #GET_SERVICES
   3148      * @see #GET_SHARED_LIBRARY_FILES
   3149      * @see #GET_SIGNATURES
   3150      * @see #GET_URI_PERMISSION_PATTERNS
   3151      * @see #MATCH_DISABLED_COMPONENTS
   3152      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3153      * @see #MATCH_UNINSTALLED_PACKAGES
   3154      *
   3155      * @hide
   3156      */
   3157     @SystemApi
   3158     public abstract List<PackageInfo> getInstalledPackagesAsUser(@PackageInfoFlags int flags,
   3159             @UserIdInt int userId);
   3160 
   3161     /**
   3162      * Check whether a particular package has been granted a particular
   3163      * permission.
   3164      *
   3165      * @param permName The name of the permission you are checking for.
   3166      * @param pkgName The name of the package you are checking against.
   3167      *
   3168      * @return If the package has the permission, PERMISSION_GRANTED is
   3169      * returned.  If it does not have the permission, PERMISSION_DENIED
   3170      * is returned.
   3171      *
   3172      * @see #PERMISSION_GRANTED
   3173      * @see #PERMISSION_DENIED
   3174      */
   3175     @CheckResult
   3176     public abstract int checkPermission(String permName, String pkgName);
   3177 
   3178     /**
   3179      * Checks whether a particular permissions has been revoked for a
   3180      * package by policy. Typically the device owner or the profile owner
   3181      * may apply such a policy. The user cannot grant policy revoked
   3182      * permissions, hence the only way for an app to get such a permission
   3183      * is by a policy change.
   3184      *
   3185      * @param permName The name of the permission you are checking for.
   3186      * @param pkgName The name of the package you are checking against.
   3187      *
   3188      * @return Whether the permission is restricted by policy.
   3189      */
   3190     @CheckResult
   3191     public abstract boolean isPermissionRevokedByPolicy(@NonNull String permName,
   3192             @NonNull String pkgName);
   3193 
   3194     /**
   3195      * Gets the package name of the component controlling runtime permissions.
   3196      *
   3197      * @return The package name.
   3198      *
   3199      * @hide
   3200      */
   3201     public abstract String getPermissionControllerPackageName();
   3202 
   3203     /**
   3204      * Add a new dynamic permission to the system.  For this to work, your
   3205      * package must have defined a permission tree through the
   3206      * {@link android.R.styleable#AndroidManifestPermissionTree
   3207      * &lt;permission-tree&gt;} tag in its manifest.  A package can only add
   3208      * permissions to trees that were defined by either its own package or
   3209      * another with the same user id; a permission is in a tree if it
   3210      * matches the name of the permission tree + ".": for example,
   3211      * "com.foo.bar" is a member of the permission tree "com.foo".
   3212      *
   3213      * <p>It is good to make your permission tree name descriptive, because you
   3214      * are taking possession of that entire set of permission names.  Thus, it
   3215      * must be under a domain you control, with a suffix that will not match
   3216      * any normal permissions that may be declared in any applications that
   3217      * are part of that domain.
   3218      *
   3219      * <p>New permissions must be added before
   3220      * any .apks are installed that use those permissions.  Permissions you
   3221      * add through this method are remembered across reboots of the device.
   3222      * If the given permission already exists, the info you supply here
   3223      * will be used to update it.
   3224      *
   3225      * @param info Description of the permission to be added.
   3226      *
   3227      * @return Returns true if a new permission was created, false if an
   3228      * existing one was updated.
   3229      *
   3230      * @throws SecurityException if you are not allowed to add the
   3231      * given permission name.
   3232      *
   3233      * @see #removePermission(String)
   3234      */
   3235     public abstract boolean addPermission(PermissionInfo info);
   3236 
   3237     /**
   3238      * Like {@link #addPermission(PermissionInfo)} but asynchronously
   3239      * persists the package manager state after returning from the call,
   3240      * allowing it to return quicker and batch a series of adds at the
   3241      * expense of no guarantee the added permission will be retained if
   3242      * the device is rebooted before it is written.
   3243      */
   3244     public abstract boolean addPermissionAsync(PermissionInfo info);
   3245 
   3246     /**
   3247      * Removes a permission that was previously added with
   3248      * {@link #addPermission(PermissionInfo)}.  The same ownership rules apply
   3249      * -- you are only allowed to remove permissions that you are allowed
   3250      * to add.
   3251      *
   3252      * @param name The name of the permission to remove.
   3253      *
   3254      * @throws SecurityException if you are not allowed to remove the
   3255      * given permission name.
   3256      *
   3257      * @see #addPermission(PermissionInfo)
   3258      */
   3259     public abstract void removePermission(String name);
   3260 
   3261 
   3262     /**
   3263      * Permission flags set when granting or revoking a permission.
   3264      *
   3265      * @hide
   3266      */
   3267     @SystemApi
   3268     @IntDef({FLAG_PERMISSION_USER_SET,
   3269             FLAG_PERMISSION_USER_FIXED,
   3270             FLAG_PERMISSION_POLICY_FIXED,
   3271             FLAG_PERMISSION_REVOKE_ON_UPGRADE,
   3272             FLAG_PERMISSION_SYSTEM_FIXED,
   3273             FLAG_PERMISSION_GRANTED_BY_DEFAULT})
   3274     @Retention(RetentionPolicy.SOURCE)
   3275     public @interface PermissionFlags {}
   3276 
   3277     /**
   3278      * Grant a runtime permission to an application which the application does not
   3279      * already have. The permission must have been requested by the application.
   3280      * If the application is not allowed to hold the permission, a {@link
   3281      * java.lang.SecurityException} is thrown.
   3282      * <p>
   3283      * <strong>Note: </strong>Using this API requires holding
   3284      * android.permission.GRANT_REVOKE_PERMISSIONS and if the user id is
   3285      * not the current user android.permission.INTERACT_ACROSS_USERS_FULL.
   3286      * </p>
   3287      *
   3288      * @param packageName The package to which to grant the permission.
   3289      * @param permissionName The permission name to grant.
   3290      * @param user The user for which to grant the permission.
   3291      *
   3292      * @see #revokeRuntimePermission(String, String, android.os.UserHandle)
   3293      * @see android.content.pm.PackageManager.PermissionFlags
   3294      *
   3295      * @hide
   3296      */
   3297     @SystemApi
   3298     public abstract void grantRuntimePermission(@NonNull String packageName,
   3299             @NonNull String permissionName, @NonNull UserHandle user);
   3300 
   3301     /**
   3302      * Revoke a runtime permission that was previously granted by {@link
   3303      * #grantRuntimePermission(String, String, android.os.UserHandle)}. The
   3304      * permission must have been requested by and granted to the application.
   3305      * If the application is not allowed to hold the permission, a {@link
   3306      * java.lang.SecurityException} is thrown.
   3307      * <p>
   3308      * <strong>Note: </strong>Using this API requires holding
   3309      * android.permission.GRANT_REVOKE_PERMISSIONS and if the user id is
   3310      * not the current user android.permission.INTERACT_ACROSS_USERS_FULL.
   3311      * </p>
   3312      *
   3313      * @param packageName The package from which to revoke the permission.
   3314      * @param permissionName The permission name to revoke.
   3315      * @param user The user for which to revoke the permission.
   3316      *
   3317      * @see #grantRuntimePermission(String, String, android.os.UserHandle)
   3318      * @see android.content.pm.PackageManager.PermissionFlags
   3319      *
   3320      * @hide
   3321      */
   3322     @SystemApi
   3323     public abstract void revokeRuntimePermission(@NonNull String packageName,
   3324             @NonNull String permissionName, @NonNull UserHandle user);
   3325 
   3326     /**
   3327      * Gets the state flags associated with a permission.
   3328      *
   3329      * @param permissionName The permission for which to get the flags.
   3330      * @param packageName The package name for which to get the flags.
   3331      * @param user The user for which to get permission flags.
   3332      * @return The permission flags.
   3333      *
   3334      * @hide
   3335      */
   3336     @SystemApi
   3337     public abstract @PermissionFlags int getPermissionFlags(String permissionName,
   3338             String packageName, @NonNull UserHandle user);
   3339 
   3340     /**
   3341      * Updates the flags associated with a permission by replacing the flags in
   3342      * the specified mask with the provided flag values.
   3343      *
   3344      * @param permissionName The permission for which to update the flags.
   3345      * @param packageName The package name for which to update the flags.
   3346      * @param flagMask The flags which to replace.
   3347      * @param flagValues The flags with which to replace.
   3348      * @param user The user for which to update the permission flags.
   3349      *
   3350      * @hide
   3351      */
   3352     @SystemApi
   3353     public abstract void updatePermissionFlags(String permissionName,
   3354             String packageName, @PermissionFlags int flagMask, int flagValues,
   3355             @NonNull UserHandle user);
   3356 
   3357     /**
   3358      * Gets whether you should show UI with rationale for requesting a permission.
   3359      * You should do this only if you do not have the permission and the context in
   3360      * which the permission is requested does not clearly communicate to the user
   3361      * what would be the benefit from grating this permission.
   3362      *
   3363      * @param permission A permission your app wants to request.
   3364      * @return Whether you can show permission rationale UI.
   3365      *
   3366      * @hide
   3367      */
   3368     public abstract boolean shouldShowRequestPermissionRationale(String permission);
   3369 
   3370     /**
   3371      * Returns an {@link android.content.Intent} suitable for passing to
   3372      * {@link android.app.Activity#startActivityForResult(android.content.Intent, int)}
   3373      * which prompts the user to grant permissions to this application.
   3374      *
   3375      * @throws NullPointerException if {@code permissions} is {@code null} or empty.
   3376      *
   3377      * @hide
   3378      */
   3379     public Intent buildRequestPermissionsIntent(@NonNull String[] permissions) {
   3380         if (ArrayUtils.isEmpty(permissions)) {
   3381            throw new IllegalArgumentException("permission cannot be null or empty");
   3382         }
   3383         Intent intent = new Intent(ACTION_REQUEST_PERMISSIONS);
   3384         intent.putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, permissions);
   3385         intent.setPackage(getPermissionControllerPackageName());
   3386         return intent;
   3387     }
   3388 
   3389     /**
   3390      * Compare the signatures of two packages to determine if the same
   3391      * signature appears in both of them.  If they do contain the same
   3392      * signature, then they are allowed special privileges when working
   3393      * with each other: they can share the same user-id, run instrumentation
   3394      * against each other, etc.
   3395      *
   3396      * @param pkg1 First package name whose signature will be compared.
   3397      * @param pkg2 Second package name whose signature will be compared.
   3398      *
   3399      * @return Returns an integer indicating whether all signatures on the
   3400      * two packages match. The value is >= 0 ({@link #SIGNATURE_MATCH}) if
   3401      * all signatures match or < 0 if there is not a match ({@link
   3402      * #SIGNATURE_NO_MATCH} or {@link #SIGNATURE_UNKNOWN_PACKAGE}).
   3403      *
   3404      * @see #checkSignatures(int, int)
   3405      * @see #SIGNATURE_MATCH
   3406      * @see #SIGNATURE_NO_MATCH
   3407      * @see #SIGNATURE_UNKNOWN_PACKAGE
   3408      */
   3409     @CheckResult
   3410     public abstract int checkSignatures(String pkg1, String pkg2);
   3411 
   3412     /**
   3413      * Like {@link #checkSignatures(String, String)}, but takes UIDs of
   3414      * the two packages to be checked.  This can be useful, for example,
   3415      * when doing the check in an IPC, where the UID is the only identity
   3416      * available.  It is functionally identical to determining the package
   3417      * associated with the UIDs and checking their signatures.
   3418      *
   3419      * @param uid1 First UID whose signature will be compared.
   3420      * @param uid2 Second UID whose signature will be compared.
   3421      *
   3422      * @return Returns an integer indicating whether all signatures on the
   3423      * two packages match. The value is >= 0 ({@link #SIGNATURE_MATCH}) if
   3424      * all signatures match or < 0 if there is not a match ({@link
   3425      * #SIGNATURE_NO_MATCH} or {@link #SIGNATURE_UNKNOWN_PACKAGE}).
   3426      *
   3427      * @see #checkSignatures(String, String)
   3428      * @see #SIGNATURE_MATCH
   3429      * @see #SIGNATURE_NO_MATCH
   3430      * @see #SIGNATURE_UNKNOWN_PACKAGE
   3431      */
   3432     @CheckResult
   3433     public abstract int checkSignatures(int uid1, int uid2);
   3434 
   3435     /**
   3436      * Retrieve the names of all packages that are associated with a particular
   3437      * user id.  In most cases, this will be a single package name, the package
   3438      * that has been assigned that user id.  Where there are multiple packages
   3439      * sharing the same user id through the "sharedUserId" mechanism, all
   3440      * packages with that id will be returned.
   3441      *
   3442      * @param uid The user id for which you would like to retrieve the
   3443      * associated packages.
   3444      *
   3445      * @return Returns an array of one or more packages assigned to the user
   3446      * id, or null if there are no known packages with the given id.
   3447      */
   3448     public abstract @Nullable String[] getPackagesForUid(int uid);
   3449 
   3450     /**
   3451      * Retrieve the official name associated with a user id.  This name is
   3452      * guaranteed to never change, though it is possible for the underlying
   3453      * user id to be changed.  That is, if you are storing information about
   3454      * user ids in persistent storage, you should use the string returned
   3455      * by this function instead of the raw user-id.
   3456      *
   3457      * @param uid The user id for which you would like to retrieve a name.
   3458      * @return Returns a unique name for the given user id, or null if the
   3459      * user id is not currently assigned.
   3460      */
   3461     public abstract @Nullable String getNameForUid(int uid);
   3462 
   3463     /**
   3464      * Return the user id associated with a shared user name. Multiple
   3465      * applications can specify a shared user name in their manifest and thus
   3466      * end up using a common uid. This might be used for new applications
   3467      * that use an existing shared user name and need to know the uid of the
   3468      * shared user.
   3469      *
   3470      * @param sharedUserName The shared user name whose uid is to be retrieved.
   3471      * @return Returns the UID associated with the shared user.
   3472      * @throws NameNotFoundException if a package with the given name cannot be
   3473      *             found on the system.
   3474      * @hide
   3475      */
   3476     public abstract int getUidForSharedUser(String sharedUserName)
   3477             throws NameNotFoundException;
   3478 
   3479     /**
   3480      * Return a List of all application packages that are installed on the
   3481      * device. If flag GET_UNINSTALLED_PACKAGES has been set, a list of all
   3482      * applications including those deleted with {@code DONT_DELETE_DATA} (partially
   3483      * installed apps with data directory) will be returned.
   3484      *
   3485      * @param flags Additional option flags. Use any combination of
   3486      * {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   3487      * {@link #MATCH_SYSTEM_ONLY}, {@link #MATCH_UNINSTALLED_PACKAGES}
   3488      * to modify the data returned.
   3489      *
   3490      * @return A List of ApplicationInfo objects, one for each installed application.
   3491      *         In the unlikely case there are no installed packages, an empty list
   3492      *         is returned. If flag {@code MATCH_UNINSTALLED_PACKAGES} is set, the
   3493      *         application information is retrieved from the list of uninstalled
   3494      *         applications (which includes installed applications as well as
   3495      *         applications with data directory i.e. applications which had been
   3496      *         deleted with {@code DONT_DELETE_DATA} flag set).
   3497      *
   3498      * @see #GET_META_DATA
   3499      * @see #GET_SHARED_LIBRARY_FILES
   3500      * @see #MATCH_SYSTEM_ONLY
   3501      * @see #MATCH_UNINSTALLED_PACKAGES
   3502      */
   3503     public abstract List<ApplicationInfo> getInstalledApplications(@ApplicationInfoFlags int flags);
   3504 
   3505     /**
   3506      * Gets the ephemeral applications the user recently used. Requires
   3507      * holding "android.permission.ACCESS_EPHEMERAL_APPS".
   3508      *
   3509      * @return The ephemeral app list.
   3510      *
   3511      * @hide
   3512      */
   3513     @RequiresPermission(Manifest.permission.ACCESS_EPHEMERAL_APPS)
   3514     public abstract List<EphemeralApplicationInfo> getEphemeralApplications();
   3515 
   3516     /**
   3517      * Gets the icon for an ephemeral application.
   3518      *
   3519      * @param packageName The app package name.
   3520      *
   3521      * @hide
   3522      */
   3523     public abstract Drawable getEphemeralApplicationIcon(String packageName);
   3524 
   3525     /**
   3526      * Gets whether the caller is an ephemeral app.
   3527      *
   3528      * @return Whether caller is an ephemeral app.
   3529      *
   3530      * @see #setEphemeralCookie(byte[])
   3531      * @see #getEphemeralCookie()
   3532      * @see #getEphemeralCookieMaxSizeBytes()
   3533      *
   3534      * @hide
   3535      */
   3536     public abstract boolean isEphemeralApplication();
   3537 
   3538     /**
   3539      * Gets the maximum size in bytes of the cookie data an ephemeral app
   3540      * can store on the device.
   3541      *
   3542      * @return The max cookie size in bytes.
   3543      *
   3544      * @see #isEphemeralApplication()
   3545      * @see #setEphemeralCookie(byte[])
   3546      * @see #getEphemeralCookie()
   3547      *
   3548      * @hide
   3549      */
   3550     public abstract int getEphemeralCookieMaxSizeBytes();
   3551 
   3552     /**
   3553      * Gets the ephemeral application cookie for this app. Non
   3554      * ephemeral apps and apps that were ephemeral but were upgraded
   3555      * to non-ephemeral can still access this API. For ephemeral apps
   3556      * this cooke is cached for some time after uninstall while for
   3557      * normal apps the cookie is deleted after the app is uninstalled.
   3558      * The cookie is always present while the app is installed.
   3559      *
   3560      * @return The cookie.
   3561      *
   3562      * @see #isEphemeralApplication()
   3563      * @see #setEphemeralCookie(byte[])
   3564      * @see #getEphemeralCookieMaxSizeBytes()
   3565      *
   3566      * @hide
   3567      */
   3568     public abstract @NonNull byte[] getEphemeralCookie();
   3569 
   3570     /**
   3571      * Sets the ephemeral application cookie for the calling app. Non
   3572      * ephemeral apps and apps that were ephemeral but were upgraded
   3573      * to non-ephemeral can still access this API. For ephemeral apps
   3574      * this cooke is cached for some time after uninstall while for
   3575      * normal apps the cookie is deleted after the app is uninstalled.
   3576      * The cookie is always present while the app is installed. The
   3577      * cookie size is limited by {@link #getEphemeralCookieMaxSizeBytes()}.
   3578      *
   3579      * @param cookie The cookie data.
   3580      * @return True if the cookie was set.
   3581      *
   3582      * @see #isEphemeralApplication()
   3583      * @see #getEphemeralCookieMaxSizeBytes()
   3584      * @see #getEphemeralCookie()
   3585      *
   3586      * @hide
   3587      */
   3588     public abstract boolean setEphemeralCookie(@NonNull  byte[] cookie);
   3589 
   3590     /**
   3591      * Get a list of shared libraries that are available on the
   3592      * system.
   3593      *
   3594      * @return An array of shared library names that are
   3595      * available on the system, or null if none are installed.
   3596      *
   3597      */
   3598     public abstract String[] getSystemSharedLibraryNames();
   3599 
   3600     /**
   3601      * Get the name of the package hosting the services shared library.
   3602      *
   3603      * @return The library host package.
   3604      *
   3605      * @hide
   3606      */
   3607     public abstract @NonNull String getServicesSystemSharedLibraryPackageName();
   3608 
   3609     /**
   3610      * Get the name of the package hosting the shared components shared library.
   3611      *
   3612      * @return The library host package.
   3613      *
   3614      * @hide
   3615      */
   3616     public abstract @NonNull String getSharedSystemSharedLibraryPackageName();
   3617 
   3618     /**
   3619      * Get a list of features that are available on the
   3620      * system.
   3621      *
   3622      * @return An array of FeatureInfo classes describing the features
   3623      * that are available on the system, or null if there are none(!!).
   3624      */
   3625     public abstract FeatureInfo[] getSystemAvailableFeatures();
   3626 
   3627     /**
   3628      * Check whether the given feature name is one of the available features as
   3629      * returned by {@link #getSystemAvailableFeatures()}. This tests for the
   3630      * presence of <em>any</em> version of the given feature name; use
   3631      * {@link #hasSystemFeature(String, int)} to check for a minimum version.
   3632      *
   3633      * @return Returns true if the devices supports the feature, else false.
   3634      */
   3635     public abstract boolean hasSystemFeature(String name);
   3636 
   3637     /**
   3638      * Check whether the given feature name and version is one of the available
   3639      * features as returned by {@link #getSystemAvailableFeatures()}. Since
   3640      * features are defined to always be backwards compatible, this returns true
   3641      * if the available feature version is greater than or equal to the
   3642      * requested version.
   3643      *
   3644      * @return Returns true if the devices supports the feature, else false.
   3645      */
   3646     public abstract boolean hasSystemFeature(String name, int version);
   3647 
   3648     /**
   3649      * Determine the best action to perform for a given Intent. This is how
   3650      * {@link Intent#resolveActivity} finds an activity if a class has not been
   3651      * explicitly specified.
   3652      * <p>
   3653      * <em>Note:</em> if using an implicit Intent (without an explicit
   3654      * ComponentName specified), be sure to consider whether to set the
   3655      * {@link #MATCH_DEFAULT_ONLY} only flag. You need to do so to resolve the
   3656      * activity in the same way that
   3657      * {@link android.content.Context#startActivity(Intent)} and
   3658      * {@link android.content.Intent#resolveActivity(PackageManager)
   3659      * Intent.resolveActivity(PackageManager)} do.
   3660      * </p>
   3661      *
   3662      * @param intent An intent containing all of the desired specification
   3663      *            (action, data, type, category, and/or component).
   3664      * @param flags Additional option flags. Use any combination of
   3665      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3666      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3667      *            {@link #MATCH_DISABLED_COMPONENTS},
   3668      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3669      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3670      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3671      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3672      *            returned. The most important is {@link #MATCH_DEFAULT_ONLY},
   3673      *            to limit the resolution to only those activities that support
   3674      *            the {@link android.content.Intent#CATEGORY_DEFAULT}.
   3675      * @return Returns a ResolveInfo object containing the final activity intent
   3676      *         that was determined to be the best action. Returns null if no
   3677      *         matching activity was found. If multiple matching activities are
   3678      *         found and there is no default set, returns a ResolveInfo object
   3679      *         containing something else, such as the activity resolver.
   3680      * @see #GET_META_DATA
   3681      * @see #GET_RESOLVED_FILTER
   3682      * @see #GET_SHARED_LIBRARY_FILES
   3683      * @see #MATCH_ALL
   3684      * @see #MATCH_DISABLED_COMPONENTS
   3685      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3686      * @see #MATCH_DEFAULT_ONLY
   3687      * @see #MATCH_DIRECT_BOOT_AWARE
   3688      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3689      * @see #MATCH_SYSTEM_ONLY
   3690      * @see #MATCH_UNINSTALLED_PACKAGES
   3691      */
   3692     public abstract ResolveInfo resolveActivity(Intent intent, @ResolveInfoFlags int flags);
   3693 
   3694     /**
   3695      * Determine the best action to perform for a given Intent for a given user.
   3696      * This is how {@link Intent#resolveActivity} finds an activity if a class
   3697      * has not been explicitly specified.
   3698      * <p>
   3699      * <em>Note:</em> if using an implicit Intent (without an explicit
   3700      * ComponentName specified), be sure to consider whether to set the
   3701      * {@link #MATCH_DEFAULT_ONLY} only flag. You need to do so to resolve the
   3702      * activity in the same way that
   3703      * {@link android.content.Context#startActivity(Intent)} and
   3704      * {@link android.content.Intent#resolveActivity(PackageManager)
   3705      * Intent.resolveActivity(PackageManager)} do.
   3706      * </p>
   3707      *
   3708      * @param intent An intent containing all of the desired specification
   3709      *            (action, data, type, category, and/or component).
   3710      * @param flags Additional option flags. Use any combination of
   3711      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3712      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3713      *            {@link #MATCH_DISABLED_COMPONENTS},
   3714      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3715      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3716      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3717      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3718      *            returned. The most important is {@link #MATCH_DEFAULT_ONLY},
   3719      *            to limit the resolution to only those activities that support
   3720      *            the {@link android.content.Intent#CATEGORY_DEFAULT}.
   3721      * @param userId The user id.
   3722      * @return Returns a ResolveInfo object containing the final activity intent
   3723      *         that was determined to be the best action. Returns null if no
   3724      *         matching activity was found. If multiple matching activities are
   3725      *         found and there is no default set, returns a ResolveInfo object
   3726      *         containing something else, such as the activity resolver.
   3727      * @see #GET_META_DATA
   3728      * @see #GET_RESOLVED_FILTER
   3729      * @see #GET_SHARED_LIBRARY_FILES
   3730      * @see #MATCH_ALL
   3731      * @see #MATCH_DISABLED_COMPONENTS
   3732      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3733      * @see #MATCH_DEFAULT_ONLY
   3734      * @see #MATCH_DIRECT_BOOT_AWARE
   3735      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3736      * @see #MATCH_SYSTEM_ONLY
   3737      * @see #MATCH_UNINSTALLED_PACKAGES
   3738      * @hide
   3739      */
   3740     public abstract ResolveInfo resolveActivityAsUser(Intent intent, @ResolveInfoFlags int flags,
   3741             @UserIdInt int userId);
   3742 
   3743     /**
   3744      * Retrieve all activities that can be performed for the given intent.
   3745      *
   3746      * @param intent The desired intent as per resolveActivity().
   3747      * @param flags Additional option flags. Use any combination of
   3748      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3749      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3750      *            {@link #MATCH_DISABLED_COMPONENTS},
   3751      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3752      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3753      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3754      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3755      *            returned. The most important is {@link #MATCH_DEFAULT_ONLY},
   3756      *            to limit the resolution to only those activities that support
   3757      *            the {@link android.content.Intent#CATEGORY_DEFAULT}. Or, set
   3758      *            {@link #MATCH_ALL} to prevent any filtering of the results.
   3759      * @return Returns a List of ResolveInfo objects containing one entry for
   3760      *         each matching activity, ordered from best to worst. In other
   3761      *         words, the first item is what would be returned by
   3762      *         {@link #resolveActivity}. If there are no matching activities, an
   3763      *         empty list is returned.
   3764      * @see #GET_META_DATA
   3765      * @see #GET_RESOLVED_FILTER
   3766      * @see #GET_SHARED_LIBRARY_FILES
   3767      * @see #MATCH_ALL
   3768      * @see #MATCH_DISABLED_COMPONENTS
   3769      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3770      * @see #MATCH_DEFAULT_ONLY
   3771      * @see #MATCH_DIRECT_BOOT_AWARE
   3772      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3773      * @see #MATCH_SYSTEM_ONLY
   3774      * @see #MATCH_UNINSTALLED_PACKAGES
   3775      */
   3776     public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
   3777             @ResolveInfoFlags int flags);
   3778 
   3779     /**
   3780      * Retrieve all activities that can be performed for the given intent, for a
   3781      * specific user.
   3782      *
   3783      * @param intent The desired intent as per resolveActivity().
   3784      * @param flags Additional option flags. Use any combination of
   3785      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3786      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3787      *            {@link #MATCH_DISABLED_COMPONENTS},
   3788      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3789      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3790      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3791      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3792      *            returned. The most important is {@link #MATCH_DEFAULT_ONLY},
   3793      *            to limit the resolution to only those activities that support
   3794      *            the {@link android.content.Intent#CATEGORY_DEFAULT}. Or, set
   3795      *            {@link #MATCH_ALL} to prevent any filtering of the results.
   3796      * @return Returns a List of ResolveInfo objects containing one entry for
   3797      *         each matching activity, ordered from best to worst. In other
   3798      *         words, the first item is what would be returned by
   3799      *         {@link #resolveActivity}. If there are no matching activities, an
   3800      *         empty list is returned.
   3801      * @see #GET_META_DATA
   3802      * @see #GET_RESOLVED_FILTER
   3803      * @see #GET_SHARED_LIBRARY_FILES
   3804      * @see #MATCH_ALL
   3805      * @see #MATCH_DISABLED_COMPONENTS
   3806      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3807      * @see #MATCH_DEFAULT_ONLY
   3808      * @see #MATCH_DIRECT_BOOT_AWARE
   3809      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3810      * @see #MATCH_SYSTEM_ONLY
   3811      * @see #MATCH_UNINSTALLED_PACKAGES
   3812      * @hide
   3813      */
   3814     public abstract List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
   3815             @ResolveInfoFlags int flags, @UserIdInt int userId);
   3816 
   3817     /**
   3818      * Retrieve a set of activities that should be presented to the user as
   3819      * similar options. This is like {@link #queryIntentActivities}, except it
   3820      * also allows you to supply a list of more explicit Intents that you would
   3821      * like to resolve to particular options, and takes care of returning the
   3822      * final ResolveInfo list in a reasonable order, with no duplicates, based
   3823      * on those inputs.
   3824      *
   3825      * @param caller The class name of the activity that is making the request.
   3826      *            This activity will never appear in the output list. Can be
   3827      *            null.
   3828      * @param specifics An array of Intents that should be resolved to the first
   3829      *            specific results. Can be null.
   3830      * @param intent The desired intent as per resolveActivity().
   3831      * @param flags Additional option flags. Use any combination of
   3832      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3833      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3834      *            {@link #MATCH_DISABLED_COMPONENTS},
   3835      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3836      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3837      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3838      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3839      *            returned. The most important is {@link #MATCH_DEFAULT_ONLY},
   3840      *            to limit the resolution to only those activities that support
   3841      *            the {@link android.content.Intent#CATEGORY_DEFAULT}.
   3842      * @return Returns a List of ResolveInfo objects containing one entry for
   3843      *         each matching activity. The list is ordered first by all of the
   3844      *         intents resolved in <var>specifics</var> and then any additional
   3845      *         activities that can handle <var>intent</var> but did not get
   3846      *         included by one of the <var>specifics</var> intents. If there are
   3847      *         no matching activities, an empty list is returned.
   3848      * @see #GET_META_DATA
   3849      * @see #GET_RESOLVED_FILTER
   3850      * @see #GET_SHARED_LIBRARY_FILES
   3851      * @see #MATCH_ALL
   3852      * @see #MATCH_DISABLED_COMPONENTS
   3853      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3854      * @see #MATCH_DEFAULT_ONLY
   3855      * @see #MATCH_DIRECT_BOOT_AWARE
   3856      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3857      * @see #MATCH_SYSTEM_ONLY
   3858      * @see #MATCH_UNINSTALLED_PACKAGES
   3859      */
   3860     public abstract List<ResolveInfo> queryIntentActivityOptions(
   3861             ComponentName caller, Intent[] specifics, Intent intent, @ResolveInfoFlags int flags);
   3862 
   3863     /**
   3864      * Retrieve all receivers that can handle a broadcast of the given intent.
   3865      *
   3866      * @param intent The desired intent as per resolveActivity().
   3867      * @param flags Additional option flags. Use any combination of
   3868      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3869      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3870      *            {@link #MATCH_DISABLED_COMPONENTS},
   3871      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3872      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3873      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3874      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3875      *            returned.
   3876      * @return Returns a List of ResolveInfo objects containing one entry for
   3877      *         each matching receiver, ordered from best to worst. If there are
   3878      *         no matching receivers, an empty list or null is returned.
   3879      * @see #GET_META_DATA
   3880      * @see #GET_RESOLVED_FILTER
   3881      * @see #GET_SHARED_LIBRARY_FILES
   3882      * @see #MATCH_ALL
   3883      * @see #MATCH_DISABLED_COMPONENTS
   3884      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3885      * @see #MATCH_DEFAULT_ONLY
   3886      * @see #MATCH_DIRECT_BOOT_AWARE
   3887      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3888      * @see #MATCH_SYSTEM_ONLY
   3889      * @see #MATCH_UNINSTALLED_PACKAGES
   3890      */
   3891     public abstract List<ResolveInfo> queryBroadcastReceivers(Intent intent,
   3892             @ResolveInfoFlags int flags);
   3893 
   3894     /**
   3895      * Retrieve all receivers that can handle a broadcast of the given intent,
   3896      * for a specific user.
   3897      *
   3898      * @param intent The desired intent as per resolveActivity().
   3899      * @param flags Additional option flags. Use any combination of
   3900      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3901      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3902      *            {@link #MATCH_DISABLED_COMPONENTS},
   3903      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3904      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3905      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3906      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3907      *            returned.
   3908      * @param userHandle UserHandle of the user being queried.
   3909      * @return Returns a List of ResolveInfo objects containing one entry for
   3910      *         each matching receiver, ordered from best to worst. If there are
   3911      *         no matching receivers, an empty list or null is returned.
   3912      * @see #GET_META_DATA
   3913      * @see #GET_RESOLVED_FILTER
   3914      * @see #GET_SHARED_LIBRARY_FILES
   3915      * @see #MATCH_ALL
   3916      * @see #MATCH_DISABLED_COMPONENTS
   3917      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3918      * @see #MATCH_DEFAULT_ONLY
   3919      * @see #MATCH_DIRECT_BOOT_AWARE
   3920      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3921      * @see #MATCH_SYSTEM_ONLY
   3922      * @see #MATCH_UNINSTALLED_PACKAGES
   3923      * @hide
   3924      */
   3925     @SystemApi
   3926     public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent,
   3927             @ResolveInfoFlags int flags, UserHandle userHandle) {
   3928         return queryBroadcastReceiversAsUser(intent, flags, userHandle.getIdentifier());
   3929     }
   3930 
   3931     /**
   3932      * @hide
   3933      */
   3934     public abstract List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent,
   3935             @ResolveInfoFlags int flags, @UserIdInt int userId);
   3936 
   3937 
   3938     /** {@hide} */
   3939     @Deprecated
   3940     public List<ResolveInfo> queryBroadcastReceivers(Intent intent,
   3941             @ResolveInfoFlags int flags, @UserIdInt int userId) {
   3942         Log.w(TAG, "STAHP USING HIDDEN APIS KTHX");
   3943         return queryBroadcastReceiversAsUser(intent, flags, userId);
   3944     }
   3945 
   3946     /**
   3947      * Determine the best service to handle for a given Intent.
   3948      *
   3949      * @param intent An intent containing all of the desired specification
   3950      *            (action, data, type, category, and/or component).
   3951      * @param flags Additional option flags. Use any combination of
   3952      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3953      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3954      *            {@link #MATCH_DISABLED_COMPONENTS},
   3955      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3956      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3957      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3958      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3959      *            returned.
   3960      * @return Returns a ResolveInfo object containing the final service intent
   3961      *         that was determined to be the best action. Returns null if no
   3962      *         matching service was found.
   3963      * @see #GET_META_DATA
   3964      * @see #GET_RESOLVED_FILTER
   3965      * @see #GET_SHARED_LIBRARY_FILES
   3966      * @see #MATCH_ALL
   3967      * @see #MATCH_DISABLED_COMPONENTS
   3968      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   3969      * @see #MATCH_DEFAULT_ONLY
   3970      * @see #MATCH_DIRECT_BOOT_AWARE
   3971      * @see #MATCH_DIRECT_BOOT_UNAWARE
   3972      * @see #MATCH_SYSTEM_ONLY
   3973      * @see #MATCH_UNINSTALLED_PACKAGES
   3974      */
   3975     public abstract ResolveInfo resolveService(Intent intent, @ResolveInfoFlags int flags);
   3976 
   3977     /**
   3978      * Retrieve all services that can match the given intent.
   3979      *
   3980      * @param intent The desired intent as per resolveService().
   3981      * @param flags Additional option flags. Use any combination of
   3982      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   3983      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   3984      *            {@link #MATCH_DISABLED_COMPONENTS},
   3985      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   3986      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   3987      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   3988      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   3989      *            returned.
   3990      * @return Returns a List of ResolveInfo objects containing one entry for
   3991      *         each matching service, ordered from best to worst. In other
   3992      *         words, the first item is what would be returned by
   3993      *         {@link #resolveService}. If there are no matching services, an
   3994      *         empty list or null is returned.
   3995      * @see #GET_META_DATA
   3996      * @see #GET_RESOLVED_FILTER
   3997      * @see #GET_SHARED_LIBRARY_FILES
   3998      * @see #MATCH_ALL
   3999      * @see #MATCH_DISABLED_COMPONENTS
   4000      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4001      * @see #MATCH_DEFAULT_ONLY
   4002      * @see #MATCH_DIRECT_BOOT_AWARE
   4003      * @see #MATCH_DIRECT_BOOT_UNAWARE
   4004      * @see #MATCH_SYSTEM_ONLY
   4005      * @see #MATCH_UNINSTALLED_PACKAGES
   4006      */
   4007     public abstract List<ResolveInfo> queryIntentServices(Intent intent,
   4008             @ResolveInfoFlags int flags);
   4009 
   4010     /**
   4011      * Retrieve all services that can match the given intent for a given user.
   4012      *
   4013      * @param intent The desired intent as per resolveService().
   4014      * @param flags Additional option flags. Use any combination of
   4015      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   4016      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   4017      *            {@link #MATCH_DISABLED_COMPONENTS},
   4018      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   4019      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   4020      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   4021      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   4022      *            returned.
   4023      * @param userId The user id.
   4024      * @return Returns a List of ResolveInfo objects containing one entry for
   4025      *         each matching service, ordered from best to worst. In other
   4026      *         words, the first item is what would be returned by
   4027      *         {@link #resolveService}. If there are no matching services, an
   4028      *         empty list or null is returned.
   4029      * @see #GET_META_DATA
   4030      * @see #GET_RESOLVED_FILTER
   4031      * @see #GET_SHARED_LIBRARY_FILES
   4032      * @see #MATCH_ALL
   4033      * @see #MATCH_DISABLED_COMPONENTS
   4034      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4035      * @see #MATCH_DEFAULT_ONLY
   4036      * @see #MATCH_DIRECT_BOOT_AWARE
   4037      * @see #MATCH_DIRECT_BOOT_UNAWARE
   4038      * @see #MATCH_SYSTEM_ONLY
   4039      * @see #MATCH_UNINSTALLED_PACKAGES
   4040      * @hide
   4041      */
   4042     public abstract List<ResolveInfo> queryIntentServicesAsUser(Intent intent,
   4043             @ResolveInfoFlags int flags, @UserIdInt int userId);
   4044 
   4045     /**
   4046      * Retrieve all providers that can match the given intent.
   4047      *
   4048      * @param intent An intent containing all of the desired specification
   4049      *            (action, data, type, category, and/or component).
   4050      * @param flags Additional option flags. Use any combination of
   4051      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   4052      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   4053      *            {@link #MATCH_DISABLED_COMPONENTS},
   4054      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   4055      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   4056      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   4057      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   4058      *            returned.
   4059      * @param userId The user id.
   4060      * @return Returns a List of ResolveInfo objects containing one entry for
   4061      *         each matching provider, ordered from best to worst. If there are
   4062      *         no matching services, an empty list or null is returned.
   4063      * @see #GET_META_DATA
   4064      * @see #GET_RESOLVED_FILTER
   4065      * @see #GET_SHARED_LIBRARY_FILES
   4066      * @see #MATCH_ALL
   4067      * @see #MATCH_DISABLED_COMPONENTS
   4068      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4069      * @see #MATCH_DEFAULT_ONLY
   4070      * @see #MATCH_DIRECT_BOOT_AWARE
   4071      * @see #MATCH_DIRECT_BOOT_UNAWARE
   4072      * @see #MATCH_SYSTEM_ONLY
   4073      * @see #MATCH_UNINSTALLED_PACKAGES
   4074      * @hide
   4075      */
   4076     public abstract List<ResolveInfo> queryIntentContentProvidersAsUser(
   4077             Intent intent, @ResolveInfoFlags int flags, @UserIdInt int userId);
   4078 
   4079     /**
   4080      * Retrieve all providers that can match the given intent.
   4081      *
   4082      * @param intent An intent containing all of the desired specification
   4083      *            (action, data, type, category, and/or component).
   4084      * @param flags Additional option flags. Use any combination of
   4085      *            {@link #GET_META_DATA}, {@link #GET_RESOLVED_FILTER},
   4086      *            {@link #GET_SHARED_LIBRARY_FILES}, {@link #MATCH_ALL},
   4087      *            {@link #MATCH_DISABLED_COMPONENTS},
   4088      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   4089      *            {@link #MATCH_DEFAULT_ONLY}, {@link #MATCH_DIRECT_BOOT_AWARE},
   4090      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   4091      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   4092      *            returned.
   4093      * @return Returns a List of ResolveInfo objects containing one entry for
   4094      *         each matching provider, ordered from best to worst. If there are
   4095      *         no matching services, an empty list or null is returned.
   4096      * @see #GET_META_DATA
   4097      * @see #GET_RESOLVED_FILTER
   4098      * @see #GET_SHARED_LIBRARY_FILES
   4099      * @see #MATCH_ALL
   4100      * @see #MATCH_DISABLED_COMPONENTS
   4101      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4102      * @see #MATCH_DEFAULT_ONLY
   4103      * @see #MATCH_DIRECT_BOOT_AWARE
   4104      * @see #MATCH_DIRECT_BOOT_UNAWARE
   4105      * @see #MATCH_SYSTEM_ONLY
   4106      * @see #MATCH_UNINSTALLED_PACKAGES
   4107      */
   4108     public abstract List<ResolveInfo> queryIntentContentProviders(Intent intent,
   4109             @ResolveInfoFlags int flags);
   4110 
   4111     /**
   4112      * Find a single content provider by its base path name.
   4113      *
   4114      * @param name The name of the provider to find.
   4115      * @param flags Additional option flags. Use any combination of
   4116      *            {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   4117      *            {@link #MATCH_ALL}, {@link #MATCH_DEFAULT_ONLY},
   4118      *            {@link #MATCH_DISABLED_COMPONENTS},
   4119      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   4120      *            {@link #MATCH_DIRECT_BOOT_AWARE},
   4121      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   4122      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   4123      *            returned.
   4124      * @return A {@link ProviderInfo} object containing information about the
   4125      *         provider. If a provider was not found, returns null.
   4126      * @see #GET_META_DATA
   4127      * @see #GET_SHARED_LIBRARY_FILES
   4128      * @see #MATCH_ALL
   4129      * @see #MATCH_DEBUG_TRIAGED_MISSING
   4130      * @see #MATCH_DEFAULT_ONLY
   4131      * @see #MATCH_DISABLED_COMPONENTS
   4132      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4133      * @see #MATCH_DIRECT_BOOT_AWARE
   4134      * @see #MATCH_DIRECT_BOOT_UNAWARE
   4135      * @see #MATCH_SYSTEM_ONLY
   4136      * @see #MATCH_UNINSTALLED_PACKAGES
   4137      */
   4138     public abstract ProviderInfo resolveContentProvider(String name,
   4139             @ComponentInfoFlags int flags);
   4140 
   4141     /**
   4142      * Find a single content provider by its base path name.
   4143      *
   4144      * @param name The name of the provider to find.
   4145      * @param flags Additional option flags. Use any combination of
   4146      *            {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   4147      *            {@link #MATCH_ALL}, {@link #MATCH_DEFAULT_ONLY},
   4148      *            {@link #MATCH_DISABLED_COMPONENTS},
   4149      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   4150      *            {@link #MATCH_DIRECT_BOOT_AWARE},
   4151      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   4152      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   4153      *            returned.
   4154      * @param userId The user id.
   4155      * @return A {@link ProviderInfo} object containing information about the
   4156      *         provider. If a provider was not found, returns null.
   4157      * @see #GET_META_DATA
   4158      * @see #GET_SHARED_LIBRARY_FILES
   4159      * @see #MATCH_ALL
   4160      * @see #MATCH_DEBUG_TRIAGED_MISSING
   4161      * @see #MATCH_DEFAULT_ONLY
   4162      * @see #MATCH_DISABLED_COMPONENTS
   4163      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4164      * @see #MATCH_DIRECT_BOOT_AWARE
   4165      * @see #MATCH_DIRECT_BOOT_UNAWARE
   4166      * @see #MATCH_SYSTEM_ONLY
   4167      * @see #MATCH_UNINSTALLED_PACKAGES
   4168      * @hide
   4169      */
   4170     public abstract ProviderInfo resolveContentProviderAsUser(String name,
   4171             @ComponentInfoFlags int flags, @UserIdInt int userId);
   4172 
   4173     /**
   4174      * Retrieve content provider information.
   4175      * <p>
   4176      * <em>Note: unlike most other methods, an empty result set is indicated
   4177      * by a null return instead of an empty list.</em>
   4178      *
   4179      * @param processName If non-null, limits the returned providers to only
   4180      *            those that are hosted by the given process. If null, all
   4181      *            content providers are returned.
   4182      * @param uid If <var>processName</var> is non-null, this is the required
   4183      *            uid owning the requested content providers.
   4184      * @param flags Additional option flags. Use any combination of
   4185      *            {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES},
   4186      *            {@link #MATCH_ALL}, {@link #MATCH_DEFAULT_ONLY},
   4187      *            {@link #MATCH_DISABLED_COMPONENTS},
   4188      *            {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   4189      *            {@link #MATCH_DIRECT_BOOT_AWARE},
   4190      *            {@link #MATCH_DIRECT_BOOT_UNAWARE}, {@link #MATCH_SYSTEM_ONLY}
   4191      *            or {@link #MATCH_UNINSTALLED_PACKAGES} to modify the data
   4192      *            returned.
   4193      * @return A list of {@link ProviderInfo} objects containing one entry for
   4194      *         each provider either matching <var>processName</var> or, if
   4195      *         <var>processName</var> is null, all known content providers.
   4196      *         <em>If there are no matching providers, null is returned.</em>
   4197      * @see #GET_META_DATA
   4198      * @see #GET_SHARED_LIBRARY_FILES
   4199      * @see #MATCH_ALL
   4200      * @see #MATCH_DEBUG_TRIAGED_MISSING
   4201      * @see #MATCH_DEFAULT_ONLY
   4202      * @see #MATCH_DISABLED_COMPONENTS
   4203      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4204      * @see #MATCH_DIRECT_BOOT_AWARE
   4205      * @see #MATCH_DIRECT_BOOT_UNAWARE
   4206      * @see #MATCH_SYSTEM_ONLY
   4207      * @see #MATCH_UNINSTALLED_PACKAGES
   4208      */
   4209     public abstract List<ProviderInfo> queryContentProviders(
   4210             String processName, int uid, @ComponentInfoFlags int flags);
   4211 
   4212     /**
   4213      * Retrieve all of the information we know about a particular
   4214      * instrumentation class.
   4215      *
   4216      * @param className The full name (i.e.
   4217      *                  com.google.apps.contacts.InstrumentList) of an
   4218      *                  Instrumentation class.
   4219      * @param flags Additional option flags. Use any combination of
   4220      *         {@link #GET_META_DATA}
   4221      *         to modify the data returned.
   4222      *
   4223      * @return An {@link InstrumentationInfo} object containing information about the
   4224      *         instrumentation.
   4225      * @throws NameNotFoundException if a package with the given name cannot be
   4226      *             found on the system.
   4227      *
   4228      * @see #GET_META_DATA
   4229      */
   4230     public abstract InstrumentationInfo getInstrumentationInfo(ComponentName className,
   4231             @InstrumentationInfoFlags int flags) throws NameNotFoundException;
   4232 
   4233     /**
   4234      * Retrieve information about available instrumentation code.  May be used
   4235      * to retrieve either all instrumentation code, or only the code targeting
   4236      * a particular package.
   4237      *
   4238      * @param targetPackage If null, all instrumentation is returned; only the
   4239      *                      instrumentation targeting this package name is
   4240      *                      returned.
   4241      * @param flags Additional option flags. Use any combination of
   4242      *         {@link #GET_META_DATA}
   4243      *         to modify the data returned.
   4244      *
   4245      * @return A list of {@link InstrumentationInfo} objects containing one
   4246      *         entry for each matching instrumentation. If there are no
   4247      *         instrumentation available, returns an empty list.
   4248      *
   4249      * @see #GET_META_DATA
   4250      */
   4251     public abstract List<InstrumentationInfo> queryInstrumentation(String targetPackage,
   4252             @InstrumentationInfoFlags int flags);
   4253 
   4254     /**
   4255      * Retrieve an image from a package.  This is a low-level API used by
   4256      * the various package manager info structures (such as
   4257      * {@link ComponentInfo} to implement retrieval of their associated
   4258      * icon.
   4259      *
   4260      * @param packageName The name of the package that this icon is coming from.
   4261      * Cannot be null.
   4262      * @param resid The resource identifier of the desired image.  Cannot be 0.
   4263      * @param appInfo Overall information about <var>packageName</var>.  This
   4264      * may be null, in which case the application information will be retrieved
   4265      * for you if needed; if you already have this information around, it can
   4266      * be much more efficient to supply it here.
   4267      *
   4268      * @return Returns a Drawable holding the requested image.  Returns null if
   4269      * an image could not be found for any reason.
   4270      */
   4271     public abstract Drawable getDrawable(String packageName, @DrawableRes int resid,
   4272             ApplicationInfo appInfo);
   4273 
   4274     /**
   4275      * Retrieve the icon associated with an activity.  Given the full name of
   4276      * an activity, retrieves the information about it and calls
   4277      * {@link ComponentInfo#loadIcon ComponentInfo.loadIcon()} to return its icon.
   4278      * If the activity cannot be found, NameNotFoundException is thrown.
   4279      *
   4280      * @param activityName Name of the activity whose icon is to be retrieved.
   4281      *
   4282      * @return Returns the image of the icon, or the default activity icon if
   4283      * it could not be found.  Does not return null.
   4284      * @throws NameNotFoundException Thrown if the resources for the given
   4285      * activity could not be loaded.
   4286      *
   4287      * @see #getActivityIcon(Intent)
   4288      */
   4289     public abstract Drawable getActivityIcon(ComponentName activityName)
   4290             throws NameNotFoundException;
   4291 
   4292     /**
   4293      * Retrieve the icon associated with an Intent.  If intent.getClassName() is
   4294      * set, this simply returns the result of
   4295      * getActivityIcon(intent.getClassName()).  Otherwise it resolves the intent's
   4296      * component and returns the icon associated with the resolved component.
   4297      * If intent.getClassName() cannot be found or the Intent cannot be resolved
   4298      * to a component, NameNotFoundException is thrown.
   4299      *
   4300      * @param intent The intent for which you would like to retrieve an icon.
   4301      *
   4302      * @return Returns the image of the icon, or the default activity icon if
   4303      * it could not be found.  Does not return null.
   4304      * @throws NameNotFoundException Thrown if the resources for application
   4305      * matching the given intent could not be loaded.
   4306      *
   4307      * @see #getActivityIcon(ComponentName)
   4308      */
   4309     public abstract Drawable getActivityIcon(Intent intent)
   4310             throws NameNotFoundException;
   4311 
   4312     /**
   4313      * Retrieve the banner associated with an activity. Given the full name of
   4314      * an activity, retrieves the information about it and calls
   4315      * {@link ComponentInfo#loadIcon ComponentInfo.loadIcon()} to return its
   4316      * banner. If the activity cannot be found, NameNotFoundException is thrown.
   4317      *
   4318      * @param activityName Name of the activity whose banner is to be retrieved.
   4319      * @return Returns the image of the banner, or null if the activity has no
   4320      *         banner specified.
   4321      * @throws NameNotFoundException Thrown if the resources for the given
   4322      *             activity could not be loaded.
   4323      * @see #getActivityBanner(Intent)
   4324      */
   4325     public abstract Drawable getActivityBanner(ComponentName activityName)
   4326             throws NameNotFoundException;
   4327 
   4328     /**
   4329      * Retrieve the banner associated with an Intent. If intent.getClassName()
   4330      * is set, this simply returns the result of
   4331      * getActivityBanner(intent.getClassName()). Otherwise it resolves the
   4332      * intent's component and returns the banner associated with the resolved
   4333      * component. If intent.getClassName() cannot be found or the Intent cannot
   4334      * be resolved to a component, NameNotFoundException is thrown.
   4335      *
   4336      * @param intent The intent for which you would like to retrieve a banner.
   4337      * @return Returns the image of the banner, or null if the activity has no
   4338      *         banner specified.
   4339      * @throws NameNotFoundException Thrown if the resources for application
   4340      *             matching the given intent could not be loaded.
   4341      * @see #getActivityBanner(ComponentName)
   4342      */
   4343     public abstract Drawable getActivityBanner(Intent intent)
   4344             throws NameNotFoundException;
   4345 
   4346     /**
   4347      * Return the generic icon for an activity that is used when no specific
   4348      * icon is defined.
   4349      *
   4350      * @return Drawable Image of the icon.
   4351      */
   4352     public abstract Drawable getDefaultActivityIcon();
   4353 
   4354     /**
   4355      * Retrieve the icon associated with an application.  If it has not defined
   4356      * an icon, the default app icon is returned.  Does not return null.
   4357      *
   4358      * @param info Information about application being queried.
   4359      *
   4360      * @return Returns the image of the icon, or the default application icon
   4361      * if it could not be found.
   4362      *
   4363      * @see #getApplicationIcon(String)
   4364      */
   4365     public abstract Drawable getApplicationIcon(ApplicationInfo info);
   4366 
   4367     /**
   4368      * Retrieve the icon associated with an application.  Given the name of the
   4369      * application's package, retrieves the information about it and calls
   4370      * getApplicationIcon() to return its icon. If the application cannot be
   4371      * found, NameNotFoundException is thrown.
   4372      *
   4373      * @param packageName Name of the package whose application icon is to be
   4374      *                    retrieved.
   4375      *
   4376      * @return Returns the image of the icon, or the default application icon
   4377      * if it could not be found.  Does not return null.
   4378      * @throws NameNotFoundException Thrown if the resources for the given
   4379      * application could not be loaded.
   4380      *
   4381      * @see #getApplicationIcon(ApplicationInfo)
   4382      */
   4383     public abstract Drawable getApplicationIcon(String packageName)
   4384             throws NameNotFoundException;
   4385 
   4386     /**
   4387      * Retrieve the banner associated with an application.
   4388      *
   4389      * @param info Information about application being queried.
   4390      * @return Returns the image of the banner or null if the application has no
   4391      *         banner specified.
   4392      * @see #getApplicationBanner(String)
   4393      */
   4394     public abstract Drawable getApplicationBanner(ApplicationInfo info);
   4395 
   4396     /**
   4397      * Retrieve the banner associated with an application. Given the name of the
   4398      * application's package, retrieves the information about it and calls
   4399      * getApplicationIcon() to return its banner. If the application cannot be
   4400      * found, NameNotFoundException is thrown.
   4401      *
   4402      * @param packageName Name of the package whose application banner is to be
   4403      *            retrieved.
   4404      * @return Returns the image of the banner or null if the application has no
   4405      *         banner specified.
   4406      * @throws NameNotFoundException Thrown if the resources for the given
   4407      *             application could not be loaded.
   4408      * @see #getApplicationBanner(ApplicationInfo)
   4409      */
   4410     public abstract Drawable getApplicationBanner(String packageName)
   4411             throws NameNotFoundException;
   4412 
   4413     /**
   4414      * Retrieve the logo associated with an activity. Given the full name of an
   4415      * activity, retrieves the information about it and calls
   4416      * {@link ComponentInfo#loadLogo ComponentInfo.loadLogo()} to return its
   4417      * logo. If the activity cannot be found, NameNotFoundException is thrown.
   4418      *
   4419      * @param activityName Name of the activity whose logo is to be retrieved.
   4420      * @return Returns the image of the logo or null if the activity has no logo
   4421      *         specified.
   4422      * @throws NameNotFoundException Thrown if the resources for the given
   4423      *             activity could not be loaded.
   4424      * @see #getActivityLogo(Intent)
   4425      */
   4426     public abstract Drawable getActivityLogo(ComponentName activityName)
   4427             throws NameNotFoundException;
   4428 
   4429     /**
   4430      * Retrieve the logo associated with an Intent.  If intent.getClassName() is
   4431      * set, this simply returns the result of
   4432      * getActivityLogo(intent.getClassName()).  Otherwise it resolves the intent's
   4433      * component and returns the logo associated with the resolved component.
   4434      * If intent.getClassName() cannot be found or the Intent cannot be resolved
   4435      * to a component, NameNotFoundException is thrown.
   4436      *
   4437      * @param intent The intent for which you would like to retrieve a logo.
   4438      *
   4439      * @return Returns the image of the logo, or null if the activity has no
   4440      * logo specified.
   4441      *
   4442      * @throws NameNotFoundException Thrown if the resources for application
   4443      * matching the given intent could not be loaded.
   4444      *
   4445      * @see #getActivityLogo(ComponentName)
   4446      */
   4447     public abstract Drawable getActivityLogo(Intent intent)
   4448             throws NameNotFoundException;
   4449 
   4450     /**
   4451      * Retrieve the logo associated with an application.  If it has not specified
   4452      * a logo, this method returns null.
   4453      *
   4454      * @param info Information about application being queried.
   4455      *
   4456      * @return Returns the image of the logo, or null if no logo is specified
   4457      * by the application.
   4458      *
   4459      * @see #getApplicationLogo(String)
   4460      */
   4461     public abstract Drawable getApplicationLogo(ApplicationInfo info);
   4462 
   4463     /**
   4464      * Retrieve the logo associated with an application.  Given the name of the
   4465      * application's package, retrieves the information about it and calls
   4466      * getApplicationLogo() to return its logo. If the application cannot be
   4467      * found, NameNotFoundException is thrown.
   4468      *
   4469      * @param packageName Name of the package whose application logo is to be
   4470      *                    retrieved.
   4471      *
   4472      * @return Returns the image of the logo, or null if no application logo
   4473      * has been specified.
   4474      *
   4475      * @throws NameNotFoundException Thrown if the resources for the given
   4476      * application could not be loaded.
   4477      *
   4478      * @see #getApplicationLogo(ApplicationInfo)
   4479      */
   4480     public abstract Drawable getApplicationLogo(String packageName)
   4481             throws NameNotFoundException;
   4482 
   4483     /**
   4484      * Returns a managed-user-style badged copy of the given drawable allowing the user to
   4485      * distinguish it from the original drawable.
   4486      * The caller can specify the location in the bounds of the drawable to be
   4487      * badged where the badge should be applied as well as the density of the
   4488      * badge to be used.
   4489      * <p>
   4490      * If the original drawable is a BitmapDrawable and the backing bitmap is
   4491      * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
   4492      * is performed in place and the original drawable is returned.
   4493      * </p>
   4494      *
   4495      * @param drawable The drawable to badge.
   4496      * @param badgeLocation Where in the bounds of the badged drawable to place
   4497      *         the badge. If it's {@code null}, the badge is applied on top of the entire
   4498      *         drawable being badged.
   4499      * @param badgeDensity The optional desired density for the badge as per
   4500      *         {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
   4501      *         the density of the display is used.
   4502      * @return A drawable that combines the original drawable and a badge as
   4503      *         determined by the system.
   4504      * @hide
   4505      */
   4506     public abstract Drawable getManagedUserBadgedDrawable(Drawable drawable, Rect badgeLocation,
   4507         int badgeDensity);
   4508 
   4509     /**
   4510      * If the target user is a managed profile, then this returns a badged copy of the given icon
   4511      * to be able to distinguish it from the original icon. For badging an arbitrary drawable use
   4512      * {@link #getUserBadgedDrawableForDensity(
   4513      * android.graphics.drawable.Drawable, UserHandle, android.graphics.Rect, int)}.
   4514      * <p>
   4515      * If the original drawable is a BitmapDrawable and the backing bitmap is
   4516      * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
   4517      * is performed in place and the original drawable is returned.
   4518      * </p>
   4519      *
   4520      * @param icon The icon to badge.
   4521      * @param user The target user.
   4522      * @return A drawable that combines the original icon and a badge as
   4523      *         determined by the system.
   4524      */
   4525     public abstract Drawable getUserBadgedIcon(Drawable icon, UserHandle user);
   4526 
   4527     /**
   4528      * If the target user is a managed profile of the calling user or the caller
   4529      * is itself a managed profile, then this returns a badged copy of the given
   4530      * drawable allowing the user to distinguish it from the original drawable.
   4531      * The caller can specify the location in the bounds of the drawable to be
   4532      * badged where the badge should be applied as well as the density of the
   4533      * badge to be used.
   4534      * <p>
   4535      * If the original drawable is a BitmapDrawable and the backing bitmap is
   4536      * mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
   4537      * is performed in place and the original drawable is returned.
   4538      * </p>
   4539      *
   4540      * @param drawable The drawable to badge.
   4541      * @param user The target user.
   4542      * @param badgeLocation Where in the bounds of the badged drawable to place
   4543      *         the badge. If it's {@code null}, the badge is applied on top of the entire
   4544      *         drawable being badged.
   4545      * @param badgeDensity The optional desired density for the badge as per
   4546      *         {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
   4547      *         the density of the display is used.
   4548      * @return A drawable that combines the original drawable and a badge as
   4549      *         determined by the system.
   4550      */
   4551     public abstract Drawable getUserBadgedDrawableForDensity(Drawable drawable,
   4552             UserHandle user, Rect badgeLocation, int badgeDensity);
   4553 
   4554     /**
   4555      * If the target user is a managed profile of the calling user or the caller
   4556      * is itself a managed profile, then this returns a drawable to use as a small
   4557      * icon to include in a view to distinguish it from the original icon.
   4558      *
   4559      * @param user The target user.
   4560      * @param density The optional desired density for the badge as per
   4561      *         {@link android.util.DisplayMetrics#densityDpi}. If not provided
   4562      *         the density of the current display is used.
   4563      * @return the drawable or null if no drawable is required.
   4564      * @hide
   4565      */
   4566     public abstract Drawable getUserBadgeForDensity(UserHandle user, int density);
   4567 
   4568     /**
   4569      * If the target user is a managed profile of the calling user or the caller
   4570      * is itself a managed profile, then this returns a drawable to use as a small
   4571      * icon to include in a view to distinguish it from the original icon. This version
   4572      * doesn't have background protection and should be used over a light background instead of
   4573      * a badge.
   4574      *
   4575      * @param user The target user.
   4576      * @param density The optional desired density for the badge as per
   4577      *         {@link android.util.DisplayMetrics#densityDpi}. If not provided
   4578      *         the density of the current display is used.
   4579      * @return the drawable or null if no drawable is required.
   4580      * @hide
   4581      */
   4582     public abstract Drawable getUserBadgeForDensityNoBackground(UserHandle user, int density);
   4583 
   4584     /**
   4585      * If the target user is a managed profile of the calling user or the caller
   4586      * is itself a managed profile, then this returns a copy of the label with
   4587      * badging for accessibility services like talkback. E.g. passing in "Email"
   4588      * and it might return "Work Email" for Email in the work profile.
   4589      *
   4590      * @param label The label to change.
   4591      * @param user The target user.
   4592      * @return A label that combines the original label and a badge as
   4593      *         determined by the system.
   4594      */
   4595     public abstract CharSequence getUserBadgedLabel(CharSequence label, UserHandle user);
   4596 
   4597     /**
   4598      * Retrieve text from a package.  This is a low-level API used by
   4599      * the various package manager info structures (such as
   4600      * {@link ComponentInfo} to implement retrieval of their associated
   4601      * labels and other text.
   4602      *
   4603      * @param packageName The name of the package that this text is coming from.
   4604      * Cannot be null.
   4605      * @param resid The resource identifier of the desired text.  Cannot be 0.
   4606      * @param appInfo Overall information about <var>packageName</var>.  This
   4607      * may be null, in which case the application information will be retrieved
   4608      * for you if needed; if you already have this information around, it can
   4609      * be much more efficient to supply it here.
   4610      *
   4611      * @return Returns a CharSequence holding the requested text.  Returns null
   4612      * if the text could not be found for any reason.
   4613      */
   4614     public abstract CharSequence getText(String packageName, @StringRes int resid,
   4615             ApplicationInfo appInfo);
   4616 
   4617     /**
   4618      * Retrieve an XML file from a package.  This is a low-level API used to
   4619      * retrieve XML meta data.
   4620      *
   4621      * @param packageName The name of the package that this xml is coming from.
   4622      * Cannot be null.
   4623      * @param resid The resource identifier of the desired xml.  Cannot be 0.
   4624      * @param appInfo Overall information about <var>packageName</var>.  This
   4625      * may be null, in which case the application information will be retrieved
   4626      * for you if needed; if you already have this information around, it can
   4627      * be much more efficient to supply it here.
   4628      *
   4629      * @return Returns an XmlPullParser allowing you to parse out the XML
   4630      * data.  Returns null if the xml resource could not be found for any
   4631      * reason.
   4632      */
   4633     public abstract XmlResourceParser getXml(String packageName, @XmlRes int resid,
   4634             ApplicationInfo appInfo);
   4635 
   4636     /**
   4637      * Return the label to use for this application.
   4638      *
   4639      * @return Returns the label associated with this application, or null if
   4640      * it could not be found for any reason.
   4641      * @param info The application to get the label of.
   4642      */
   4643     public abstract CharSequence getApplicationLabel(ApplicationInfo info);
   4644 
   4645     /**
   4646      * Retrieve the resources associated with an activity.  Given the full
   4647      * name of an activity, retrieves the information about it and calls
   4648      * getResources() to return its application's resources.  If the activity
   4649      * cannot be found, NameNotFoundException is thrown.
   4650      *
   4651      * @param activityName Name of the activity whose resources are to be
   4652      *                     retrieved.
   4653      *
   4654      * @return Returns the application's Resources.
   4655      * @throws NameNotFoundException Thrown if the resources for the given
   4656      * application could not be loaded.
   4657      *
   4658      * @see #getResourcesForApplication(ApplicationInfo)
   4659      */
   4660     public abstract Resources getResourcesForActivity(ComponentName activityName)
   4661             throws NameNotFoundException;
   4662 
   4663     /**
   4664      * Retrieve the resources for an application.  Throws NameNotFoundException
   4665      * if the package is no longer installed.
   4666      *
   4667      * @param app Information about the desired application.
   4668      *
   4669      * @return Returns the application's Resources.
   4670      * @throws NameNotFoundException Thrown if the resources for the given
   4671      * application could not be loaded (most likely because it was uninstalled).
   4672      */
   4673     public abstract Resources getResourcesForApplication(ApplicationInfo app)
   4674             throws NameNotFoundException;
   4675 
   4676     /**
   4677      * Retrieve the resources associated with an application.  Given the full
   4678      * package name of an application, retrieves the information about it and
   4679      * calls getResources() to return its application's resources.  If the
   4680      * appPackageName cannot be found, NameNotFoundException is thrown.
   4681      *
   4682      * @param appPackageName Package name of the application whose resources
   4683      *                       are to be retrieved.
   4684      *
   4685      * @return Returns the application's Resources.
   4686      * @throws NameNotFoundException Thrown if the resources for the given
   4687      * application could not be loaded.
   4688      *
   4689      * @see #getResourcesForApplication(ApplicationInfo)
   4690      */
   4691     public abstract Resources getResourcesForApplication(String appPackageName)
   4692             throws NameNotFoundException;
   4693 
   4694     /** @hide */
   4695     public abstract Resources getResourcesForApplicationAsUser(String appPackageName,
   4696             @UserIdInt int userId) throws NameNotFoundException;
   4697 
   4698     /**
   4699      * Retrieve overall information about an application package defined
   4700      * in a package archive file
   4701      *
   4702      * @param archiveFilePath The path to the archive file
   4703      * @param flags Additional option flags. Use any combination of
   4704      *         {@link #GET_ACTIVITIES}, {@link #GET_CONFIGURATIONS},
   4705      *         {@link #GET_GIDS}, {@link #GET_INSTRUMENTATION},
   4706      *         {@link #GET_INTENT_FILTERS}, {@link #GET_META_DATA},
   4707      *         {@link #GET_PERMISSIONS}, {@link #GET_PROVIDERS},
   4708      *         {@link #GET_RECEIVERS}, {@link #GET_SERVICES},
   4709      *         {@link #GET_SHARED_LIBRARY_FILES}, {@link #GET_SIGNATURES},
   4710      *         {@link #GET_URI_PERMISSION_PATTERNS}, {@link #GET_UNINSTALLED_PACKAGES},
   4711      *         {@link #MATCH_DISABLED_COMPONENTS}, {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   4712      *         {@link #MATCH_UNINSTALLED_PACKAGES}
   4713      *         to modify the data returned.
   4714      *
   4715      * @return A PackageInfo object containing information about the
   4716      *         package archive. If the package could not be parsed,
   4717      *         returns null.
   4718      *
   4719      * @see #GET_ACTIVITIES
   4720      * @see #GET_CONFIGURATIONS
   4721      * @see #GET_GIDS
   4722      * @see #GET_INSTRUMENTATION
   4723      * @see #GET_INTENT_FILTERS
   4724      * @see #GET_META_DATA
   4725      * @see #GET_PERMISSIONS
   4726      * @see #GET_PROVIDERS
   4727      * @see #GET_RECEIVERS
   4728      * @see #GET_SERVICES
   4729      * @see #GET_SHARED_LIBRARY_FILES
   4730      * @see #GET_SIGNATURES
   4731      * @see #GET_URI_PERMISSION_PATTERNS
   4732      * @see #MATCH_DISABLED_COMPONENTS
   4733      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   4734      * @see #MATCH_UNINSTALLED_PACKAGES
   4735      *
   4736      */
   4737     public PackageInfo getPackageArchiveInfo(String archiveFilePath, @PackageInfoFlags int flags) {
   4738         final PackageParser parser = new PackageParser();
   4739         final File apkFile = new File(archiveFilePath);
   4740         try {
   4741             if ((flags & (MATCH_DIRECT_BOOT_UNAWARE | MATCH_DIRECT_BOOT_AWARE)) != 0) {
   4742                 // Caller expressed an explicit opinion about what encryption
   4743                 // aware/unaware components they want to see, so fall through and
   4744                 // give them what they want
   4745             } else {
   4746                 // Caller expressed no opinion, so match everything
   4747                 flags |= MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE;
   4748             }
   4749 
   4750             PackageParser.Package pkg = parser.parseMonolithicPackage(apkFile, 0);
   4751             if ((flags & GET_SIGNATURES) != 0) {
   4752                 PackageParser.collectCertificates(pkg, 0);
   4753             }
   4754             PackageUserState state = new PackageUserState();
   4755             return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0, null, state);
   4756         } catch (PackageParserException e) {
   4757             return null;
   4758         }
   4759     }
   4760 
   4761     /**
   4762      * @deprecated replaced by {@link PackageInstaller}
   4763      * @hide
   4764      */
   4765     @Deprecated
   4766     public abstract void installPackage(
   4767             Uri packageURI,
   4768             IPackageInstallObserver observer,
   4769             @InstallFlags int flags,
   4770             String installerPackageName);
   4771     /**
   4772      * @deprecated replaced by {@link PackageInstaller}
   4773      * @hide
   4774      */
   4775     @Deprecated
   4776     public abstract void installPackage(
   4777             Uri packageURI,
   4778             PackageInstallObserver observer,
   4779             @InstallFlags int flags,
   4780             String installerPackageName);
   4781 
   4782     /**
   4783      * If there is already an application with the given package name installed
   4784      * on the system for other users, also install it for the calling user.
   4785      * @hide
   4786      */
   4787     public abstract int installExistingPackage(String packageName) throws NameNotFoundException;
   4788 
   4789     /**
   4790      * If there is already an application with the given package name installed
   4791      * on the system for other users, also install it for the specified user.
   4792      * @hide
   4793      */
   4794      @RequiresPermission(anyOf = {
   4795             Manifest.permission.INSTALL_PACKAGES,
   4796             Manifest.permission.INTERACT_ACROSS_USERS_FULL})
   4797     public abstract int installExistingPackageAsUser(String packageName, @UserIdInt int userId)
   4798             throws NameNotFoundException;
   4799 
   4800     /**
   4801      * Allows a package listening to the
   4802      * {@link Intent#ACTION_PACKAGE_NEEDS_VERIFICATION package verification
   4803      * broadcast} to respond to the package manager. The response must include
   4804      * the {@code verificationCode} which is one of
   4805      * {@link PackageManager#VERIFICATION_ALLOW} or
   4806      * {@link PackageManager#VERIFICATION_REJECT}.
   4807      *
   4808      * @param id pending package identifier as passed via the
   4809      *            {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra.
   4810      * @param verificationCode either {@link PackageManager#VERIFICATION_ALLOW}
   4811      *            or {@link PackageManager#VERIFICATION_REJECT}.
   4812      * @throws SecurityException if the caller does not have the
   4813      *            PACKAGE_VERIFICATION_AGENT permission.
   4814      */
   4815     public abstract void verifyPendingInstall(int id, int verificationCode);
   4816 
   4817     /**
   4818      * Allows a package listening to the
   4819      * {@link Intent#ACTION_PACKAGE_NEEDS_VERIFICATION package verification
   4820      * broadcast} to extend the default timeout for a response and declare what
   4821      * action to perform after the timeout occurs. The response must include
   4822      * the {@code verificationCodeAtTimeout} which is one of
   4823      * {@link PackageManager#VERIFICATION_ALLOW} or
   4824      * {@link PackageManager#VERIFICATION_REJECT}.
   4825      *
   4826      * This method may only be called once per package id. Additional calls
   4827      * will have no effect.
   4828      *
   4829      * @param id pending package identifier as passed via the
   4830      *            {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra.
   4831      * @param verificationCodeAtTimeout either
   4832      *            {@link PackageManager#VERIFICATION_ALLOW} or
   4833      *            {@link PackageManager#VERIFICATION_REJECT}. If
   4834      *            {@code verificationCodeAtTimeout} is neither
   4835      *            {@link PackageManager#VERIFICATION_ALLOW} or
   4836      *            {@link PackageManager#VERIFICATION_REJECT}, then
   4837      *            {@code verificationCodeAtTimeout} will default to
   4838      *            {@link PackageManager#VERIFICATION_REJECT}.
   4839      * @param millisecondsToDelay the amount of time requested for the timeout.
   4840      *            Must be positive and less than
   4841      *            {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}. If
   4842      *            {@code millisecondsToDelay} is out of bounds,
   4843      *            {@code millisecondsToDelay} will be set to the closest in
   4844      *            bounds value; namely, 0 or
   4845      *            {@link PackageManager#MAXIMUM_VERIFICATION_TIMEOUT}.
   4846      * @throws SecurityException if the caller does not have the
   4847      *            PACKAGE_VERIFICATION_AGENT permission.
   4848      */
   4849     public abstract void extendVerificationTimeout(int id,
   4850             int verificationCodeAtTimeout, long millisecondsToDelay);
   4851 
   4852     /**
   4853      * Allows a package listening to the
   4854      * {@link Intent#ACTION_INTENT_FILTER_NEEDS_VERIFICATION} intent filter verification
   4855      * broadcast to respond to the package manager. The response must include
   4856      * the {@code verificationCode} which is one of
   4857      * {@link PackageManager#INTENT_FILTER_VERIFICATION_SUCCESS} or
   4858      * {@link PackageManager#INTENT_FILTER_VERIFICATION_FAILURE}.
   4859      *
   4860      * @param verificationId pending package identifier as passed via the
   4861      *            {@link PackageManager#EXTRA_VERIFICATION_ID} Intent extra.
   4862      * @param verificationCode either {@link PackageManager#INTENT_FILTER_VERIFICATION_SUCCESS}
   4863      *            or {@link PackageManager#INTENT_FILTER_VERIFICATION_FAILURE}.
   4864      * @param failedDomains a list of failed domains if the verificationCode is
   4865      *            {@link PackageManager#INTENT_FILTER_VERIFICATION_FAILURE}, otherwise null;
   4866      * @throws SecurityException if the caller does not have the
   4867      *            INTENT_FILTER_VERIFICATION_AGENT permission.
   4868      *
   4869      * @hide
   4870      */
   4871     @SystemApi
   4872     public abstract void verifyIntentFilter(int verificationId, int verificationCode,
   4873             List<String> failedDomains);
   4874 
   4875     /**
   4876      * Get the status of a Domain Verification Result for an IntentFilter. This is
   4877      * related to the {@link android.content.IntentFilter#setAutoVerify(boolean)} and
   4878      * {@link android.content.IntentFilter#getAutoVerify()}
   4879      *
   4880      * This is used by the ResolverActivity to change the status depending on what the User select
   4881      * in the Disambiguation Dialog and also used by the Settings App for changing the default App
   4882      * for a domain.
   4883      *
   4884      * @param packageName The package name of the Activity associated with the IntentFilter.
   4885      * @param userId The user id.
   4886      *
   4887      * @return The status to set to. This can be
   4888      *              {@link #INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK} or
   4889      *              {@link #INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS} or
   4890      *              {@link #INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER} or
   4891      *              {@link #INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED}
   4892      *
   4893      * @hide
   4894      */
   4895     public abstract int getIntentVerificationStatusAsUser(String packageName, @UserIdInt int userId);
   4896 
   4897     /**
   4898      * Allow to change the status of a Intent Verification status for all IntentFilter of an App.
   4899      * This is related to the {@link android.content.IntentFilter#setAutoVerify(boolean)} and
   4900      * {@link android.content.IntentFilter#getAutoVerify()}
   4901      *
   4902      * This is used by the ResolverActivity to change the status depending on what the User select
   4903      * in the Disambiguation Dialog and also used by the Settings App for changing the default App
   4904      * for a domain.
   4905      *
   4906      * @param packageName The package name of the Activity associated with the IntentFilter.
   4907      * @param status The status to set to. This can be
   4908      *              {@link #INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK} or
   4909      *              {@link #INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS} or
   4910      *              {@link #INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER}
   4911      * @param userId The user id.
   4912      *
   4913      * @return true if the status has been set. False otherwise.
   4914      *
   4915      * @hide
   4916      */
   4917     public abstract boolean updateIntentVerificationStatusAsUser(String packageName, int status,
   4918             @UserIdInt int userId);
   4919 
   4920     /**
   4921      * Get the list of IntentFilterVerificationInfo for a specific package and User.
   4922      *
   4923      * @param packageName the package name. When this parameter is set to a non null value,
   4924      *                    the results will be filtered by the package name provided.
   4925      *                    Otherwise, there will be no filtering and it will return a list
   4926      *                    corresponding for all packages
   4927      *
   4928      * @return a list of IntentFilterVerificationInfo for a specific package.
   4929      *
   4930      * @hide
   4931      */
   4932     public abstract List<IntentFilterVerificationInfo> getIntentFilterVerifications(
   4933             String packageName);
   4934 
   4935     /**
   4936      * Get the list of IntentFilter for a specific package.
   4937      *
   4938      * @param packageName the package name. This parameter is set to a non null value,
   4939      *                    the list will contain all the IntentFilter for that package.
   4940      *                    Otherwise, the list will be empty.
   4941      *
   4942      * @return a list of IntentFilter for a specific package.
   4943      *
   4944      * @hide
   4945      */
   4946     public abstract List<IntentFilter> getAllIntentFilters(String packageName);
   4947 
   4948     /**
   4949      * Get the default Browser package name for a specific user.
   4950      *
   4951      * @param userId The user id.
   4952      *
   4953      * @return the package name of the default Browser for the specified user. If the user id passed
   4954      *         is -1 (all users) it will return a null value.
   4955      *
   4956      * @hide
   4957      */
   4958     @TestApi
   4959     public abstract String getDefaultBrowserPackageNameAsUser(@UserIdInt int userId);
   4960 
   4961     /**
   4962      * Set the default Browser package name for a specific user.
   4963      *
   4964      * @param packageName The package name of the default Browser.
   4965      * @param userId The user id.
   4966      *
   4967      * @return true if the default Browser for the specified user has been set,
   4968      *         otherwise return false. If the user id passed is -1 (all users) this call will not
   4969      *         do anything and just return false.
   4970      *
   4971      * @hide
   4972      */
   4973     public abstract boolean setDefaultBrowserPackageNameAsUser(String packageName,
   4974             @UserIdInt int userId);
   4975 
   4976     /**
   4977      * Change the installer associated with a given package.  There are limitations
   4978      * on how the installer package can be changed; in particular:
   4979      * <ul>
   4980      * <li> A SecurityException will be thrown if <var>installerPackageName</var>
   4981      * is not signed with the same certificate as the calling application.
   4982      * <li> A SecurityException will be thrown if <var>targetPackage</var> already
   4983      * has an installer package, and that installer package is not signed with
   4984      * the same certificate as the calling application.
   4985      * </ul>
   4986      *
   4987      * @param targetPackage The installed package whose installer will be changed.
   4988      * @param installerPackageName The package name of the new installer.  May be
   4989      * null to clear the association.
   4990      */
   4991     public abstract void setInstallerPackageName(String targetPackage,
   4992             String installerPackageName);
   4993 
   4994     /**
   4995      * Attempts to delete a package. Since this may take a little while, the
   4996      * result will be posted back to the given observer. A deletion will fail if
   4997      * the calling context lacks the
   4998      * {@link android.Manifest.permission#DELETE_PACKAGES} permission, if the
   4999      * named package cannot be found, or if the named package is a system
   5000      * package.
   5001      *
   5002      * @param packageName The name of the package to delete
   5003      * @param observer An observer callback to get notified when the package
   5004      *            deletion is complete.
   5005      *            {@link android.content.pm.IPackageDeleteObserver#packageDeleted}
   5006      *            will be called when that happens. observer may be null to
   5007      *            indicate that no callback is desired.
   5008      * @hide
   5009      */
   5010     public abstract void deletePackage(String packageName, IPackageDeleteObserver observer,
   5011             @DeleteFlags int flags);
   5012 
   5013     /**
   5014      * Attempts to delete a package. Since this may take a little while, the
   5015      * result will be posted back to the given observer. A deletion will fail if
   5016      * the named package cannot be found, or if the named package is a system
   5017      * package.
   5018      *
   5019      * @param packageName The name of the package to delete
   5020      * @param observer An observer callback to get notified when the package
   5021      *            deletion is complete.
   5022      *            {@link android.content.pm.IPackageDeleteObserver#packageDeleted}
   5023      *            will be called when that happens. observer may be null to
   5024      *            indicate that no callback is desired.
   5025      * @param userId The user Id
   5026      * @hide
   5027      */
   5028      @RequiresPermission(anyOf = {
   5029             Manifest.permission.DELETE_PACKAGES,
   5030             Manifest.permission.INTERACT_ACROSS_USERS_FULL})
   5031     public abstract void deletePackageAsUser(String packageName, IPackageDeleteObserver observer,
   5032             @DeleteFlags int flags, @UserIdInt int userId);
   5033 
   5034     /**
   5035      * Retrieve the package name of the application that installed a package. This identifies
   5036      * which market the package came from.
   5037      *
   5038      * @param packageName The name of the package to query
   5039      */
   5040     public abstract String getInstallerPackageName(String packageName);
   5041 
   5042     /**
   5043      * Attempts to clear the user data directory of an application.
   5044      * Since this may take a little while, the result will
   5045      * be posted back to the given observer.  A deletion will fail if the
   5046      * named package cannot be found, or if the named package is a "system package".
   5047      *
   5048      * @param packageName The name of the package
   5049      * @param observer An observer callback to get notified when the operation is finished
   5050      * {@link android.content.pm.IPackageDataObserver#onRemoveCompleted(String, boolean)}
   5051      * will be called when that happens.  observer may be null to indicate that
   5052      * no callback is desired.
   5053      *
   5054      * @hide
   5055      */
   5056     public abstract void clearApplicationUserData(String packageName,
   5057             IPackageDataObserver observer);
   5058     /**
   5059      * Attempts to delete the cache files associated with an application.
   5060      * Since this may take a little while, the result will
   5061      * be posted back to the given observer.  A deletion will fail if the calling context
   5062      * lacks the {@link android.Manifest.permission#DELETE_CACHE_FILES} permission, if the
   5063      * named package cannot be found, or if the named package is a "system package".
   5064      *
   5065      * @param packageName The name of the package to delete
   5066      * @param observer An observer callback to get notified when the cache file deletion
   5067      * is complete.
   5068      * {@link android.content.pm.IPackageDataObserver#onRemoveCompleted(String, boolean)}
   5069      * will be called when that happens.  observer may be null to indicate that
   5070      * no callback is desired.
   5071      *
   5072      * @hide
   5073      */
   5074     public abstract void deleteApplicationCacheFiles(String packageName,
   5075             IPackageDataObserver observer);
   5076 
   5077     /**
   5078      * Attempts to delete the cache files associated with an application for a given user. Since
   5079      * this may take a little while, the result will be posted back to the given observer. A
   5080      * deletion will fail if the calling context lacks the
   5081      * {@link android.Manifest.permission#DELETE_CACHE_FILES} permission, if the named package
   5082      * cannot be found, or if the named package is a "system package". If {@code userId} does not
   5083      * belong to the calling user, the caller must have
   5084      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS} permission.
   5085      *
   5086      * @param packageName The name of the package to delete
   5087      * @param userId the user for which the cache files needs to be deleted
   5088      * @param observer An observer callback to get notified when the cache file deletion is
   5089      *            complete.
   5090      *            {@link android.content.pm.IPackageDataObserver#onRemoveCompleted(String, boolean)}
   5091      *            will be called when that happens. observer may be null to indicate that no
   5092      *            callback is desired.
   5093      * @hide
   5094      */
   5095     public abstract void deleteApplicationCacheFilesAsUser(String packageName, int userId,
   5096             IPackageDataObserver observer);
   5097 
   5098     /**
   5099      * Free storage by deleting LRU sorted list of cache files across
   5100      * all applications. If the currently available free storage
   5101      * on the device is greater than or equal to the requested
   5102      * free storage, no cache files are cleared. If the currently
   5103      * available storage on the device is less than the requested
   5104      * free storage, some or all of the cache files across
   5105      * all applications are deleted (based on last accessed time)
   5106      * to increase the free storage space on the device to
   5107      * the requested value. There is no guarantee that clearing all
   5108      * the cache files from all applications will clear up
   5109      * enough storage to achieve the desired value.
   5110      * @param freeStorageSize The number of bytes of storage to be
   5111      * freed by the system. Say if freeStorageSize is XX,
   5112      * and the current free storage is YY,
   5113      * if XX is less than YY, just return. if not free XX-YY number
   5114      * of bytes if possible.
   5115      * @param observer call back used to notify when
   5116      * the operation is completed
   5117      *
   5118      * @hide
   5119      */
   5120     public void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer) {
   5121         freeStorageAndNotify(null, freeStorageSize, observer);
   5122     }
   5123 
   5124     /** {@hide} */
   5125     public abstract void freeStorageAndNotify(String volumeUuid, long freeStorageSize,
   5126             IPackageDataObserver observer);
   5127 
   5128     /**
   5129      * Free storage by deleting LRU sorted list of cache files across
   5130      * all applications. If the currently available free storage
   5131      * on the device is greater than or equal to the requested
   5132      * free storage, no cache files are cleared. If the currently
   5133      * available storage on the device is less than the requested
   5134      * free storage, some or all of the cache files across
   5135      * all applications are deleted (based on last accessed time)
   5136      * to increase the free storage space on the device to
   5137      * the requested value. There is no guarantee that clearing all
   5138      * the cache files from all applications will clear up
   5139      * enough storage to achieve the desired value.
   5140      * @param freeStorageSize The number of bytes of storage to be
   5141      * freed by the system. Say if freeStorageSize is XX,
   5142      * and the current free storage is YY,
   5143      * if XX is less than YY, just return. if not free XX-YY number
   5144      * of bytes if possible.
   5145      * @param pi IntentSender call back used to
   5146      * notify when the operation is completed.May be null
   5147      * to indicate that no call back is desired.
   5148      *
   5149      * @hide
   5150      */
   5151     public void freeStorage(long freeStorageSize, IntentSender pi) {
   5152         freeStorage(null, freeStorageSize, pi);
   5153     }
   5154 
   5155     /** {@hide} */
   5156     public abstract void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi);
   5157 
   5158     /**
   5159      * Retrieve the size information for a package.
   5160      * Since this may take a little while, the result will
   5161      * be posted back to the given observer.  The calling context
   5162      * should have the {@link android.Manifest.permission#GET_PACKAGE_SIZE} permission.
   5163      *
   5164      * @param packageName The name of the package whose size information is to be retrieved
   5165      * @param userId The user whose size information should be retrieved.
   5166      * @param observer An observer callback to get notified when the operation
   5167      * is complete.
   5168      * {@link android.content.pm.IPackageStatsObserver#onGetStatsCompleted(PackageStats, boolean)}
   5169      * The observer's callback is invoked with a PackageStats object(containing the
   5170      * code, data and cache sizes of the package) and a boolean value representing
   5171      * the status of the operation. observer may be null to indicate that
   5172      * no callback is desired.
   5173      *
   5174      * @hide
   5175      */
   5176     public abstract void getPackageSizeInfoAsUser(String packageName, @UserIdInt int userId,
   5177             IPackageStatsObserver observer);
   5178 
   5179     /**
   5180      * Like {@link #getPackageSizeInfoAsUser(String, int, IPackageStatsObserver)}, but
   5181      * returns the size for the calling user.
   5182      *
   5183      * @hide
   5184      */
   5185     public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {
   5186         getPackageSizeInfoAsUser(packageName, UserHandle.myUserId(), observer);
   5187     }
   5188 
   5189     /**
   5190      * @deprecated This function no longer does anything; it was an old
   5191      * approach to managing preferred activities, which has been superseded
   5192      * by (and conflicts with) the modern activity-based preferences.
   5193      */
   5194     @Deprecated
   5195     public abstract void addPackageToPreferred(String packageName);
   5196 
   5197     /**
   5198      * @deprecated This function no longer does anything; it was an old
   5199      * approach to managing preferred activities, which has been superseded
   5200      * by (and conflicts with) the modern activity-based preferences.
   5201      */
   5202     @Deprecated
   5203     public abstract void removePackageFromPreferred(String packageName);
   5204 
   5205     /**
   5206      * Retrieve the list of all currently configured preferred packages.  The
   5207      * first package on the list is the most preferred, the last is the
   5208      * least preferred.
   5209      *
   5210      * @param flags Additional option flags. Use any combination of
   5211      *         {@link #GET_ACTIVITIES}, {@link #GET_CONFIGURATIONS},
   5212      *         {@link #GET_GIDS}, {@link #GET_INSTRUMENTATION},
   5213      *         {@link #GET_INTENT_FILTERS}, {@link #GET_META_DATA},
   5214      *         {@link #GET_PERMISSIONS}, {@link #GET_PROVIDERS},
   5215      *         {@link #GET_RECEIVERS}, {@link #GET_SERVICES},
   5216      *         {@link #GET_SHARED_LIBRARY_FILES}, {@link #GET_SIGNATURES},
   5217      *         {@link #GET_URI_PERMISSION_PATTERNS}, {@link #GET_UNINSTALLED_PACKAGES},
   5218      *         {@link #MATCH_DISABLED_COMPONENTS}, {@link #MATCH_DISABLED_UNTIL_USED_COMPONENTS},
   5219      *         {@link #MATCH_UNINSTALLED_PACKAGES}
   5220      *         to modify the data returned.
   5221      *
   5222      * @return A List of PackageInfo objects, one for each preferred application,
   5223      *         in order of preference.
   5224      *
   5225      * @see #GET_ACTIVITIES
   5226      * @see #GET_CONFIGURATIONS
   5227      * @see #GET_GIDS
   5228      * @see #GET_INSTRUMENTATION
   5229      * @see #GET_INTENT_FILTERS
   5230      * @see #GET_META_DATA
   5231      * @see #GET_PERMISSIONS
   5232      * @see #GET_PROVIDERS
   5233      * @see #GET_RECEIVERS
   5234      * @see #GET_SERVICES
   5235      * @see #GET_SHARED_LIBRARY_FILES
   5236      * @see #GET_SIGNATURES
   5237      * @see #GET_URI_PERMISSION_PATTERNS
   5238      * @see #MATCH_DISABLED_COMPONENTS
   5239      * @see #MATCH_DISABLED_UNTIL_USED_COMPONENTS
   5240      * @see #MATCH_UNINSTALLED_PACKAGES
   5241      */
   5242     public abstract List<PackageInfo> getPreferredPackages(@PackageInfoFlags int flags);
   5243 
   5244     /**
   5245      * @deprecated This is a protected API that should not have been available
   5246      * to third party applications.  It is the platform's responsibility for
   5247      * assigning preferred activities and this cannot be directly modified.
   5248      *
   5249      * Add a new preferred activity mapping to the system.  This will be used
   5250      * to automatically select the given activity component when
   5251      * {@link Context#startActivity(Intent) Context.startActivity()} finds
   5252      * multiple matching activities and also matches the given filter.
   5253      *
   5254      * @param filter The set of intents under which this activity will be
   5255      * made preferred.
   5256      * @param match The IntentFilter match category that this preference
   5257      * applies to.
   5258      * @param set The set of activities that the user was picking from when
   5259      * this preference was made.
   5260      * @param activity The component name of the activity that is to be
   5261      * preferred.
   5262      */
   5263     @Deprecated
   5264     public abstract void addPreferredActivity(IntentFilter filter, int match,
   5265             ComponentName[] set, ComponentName activity);
   5266 
   5267     /**
   5268      * Same as {@link #addPreferredActivity(IntentFilter, int,
   5269             ComponentName[], ComponentName)}, but with a specific userId to apply the preference
   5270             to.
   5271      * @hide
   5272      */
   5273     public void addPreferredActivityAsUser(IntentFilter filter, int match,
   5274             ComponentName[] set, ComponentName activity, @UserIdInt int userId) {
   5275         throw new RuntimeException("Not implemented. Must override in a subclass.");
   5276     }
   5277 
   5278     /**
   5279      * @deprecated This is a protected API that should not have been available
   5280      * to third party applications.  It is the platform's responsibility for
   5281      * assigning preferred activities and this cannot be directly modified.
   5282      *
   5283      * Replaces an existing preferred activity mapping to the system, and if that were not present
   5284      * adds a new preferred activity.  This will be used
   5285      * to automatically select the given activity component when
   5286      * {@link Context#startActivity(Intent) Context.startActivity()} finds
   5287      * multiple matching activities and also matches the given filter.
   5288      *
   5289      * @param filter The set of intents under which this activity will be
   5290      * made preferred.
   5291      * @param match The IntentFilter match category that this preference
   5292      * applies to.
   5293      * @param set The set of activities that the user was picking from when
   5294      * this preference was made.
   5295      * @param activity The component name of the activity that is to be
   5296      * preferred.
   5297      * @hide
   5298      */
   5299     @Deprecated
   5300     public abstract void replacePreferredActivity(IntentFilter filter, int match,
   5301             ComponentName[] set, ComponentName activity);
   5302 
   5303     /**
   5304      * @hide
   5305      */
   5306     @Deprecated
   5307     public void replacePreferredActivityAsUser(IntentFilter filter, int match,
   5308            ComponentName[] set, ComponentName activity, @UserIdInt int userId) {
   5309         throw new RuntimeException("Not implemented. Must override in a subclass.");
   5310     }
   5311 
   5312     /**
   5313      * Remove all preferred activity mappings, previously added with
   5314      * {@link #addPreferredActivity}, from the
   5315      * system whose activities are implemented in the given package name.
   5316      * An application can only clear its own package(s).
   5317      *
   5318      * @param packageName The name of the package whose preferred activity
   5319      * mappings are to be removed.
   5320      */
   5321     public abstract void clearPackagePreferredActivities(String packageName);
   5322 
   5323     /**
   5324      * Retrieve all preferred activities, previously added with
   5325      * {@link #addPreferredActivity}, that are
   5326      * currently registered with the system.
   5327      *
   5328      * @param outFilters A required list in which to place the filters of all of the
   5329      * preferred activities.
   5330      * @param outActivities A required list in which to place the component names of
   5331      * all of the preferred activities.
   5332      * @param packageName An optional package in which you would like to limit
   5333      * the list.  If null, all activities will be returned; if non-null, only
   5334      * those activities in the given package are returned.
   5335      *
   5336      * @return Returns the total number of registered preferred activities
   5337      * (the number of distinct IntentFilter records, not the number of unique
   5338      * activity components) that were found.
   5339      */
   5340     public abstract int getPreferredActivities(@NonNull List<IntentFilter> outFilters,
   5341             @NonNull List<ComponentName> outActivities, String packageName);
   5342 
   5343     /**
   5344      * Ask for the set of available 'home' activities and the current explicit
   5345      * default, if any.
   5346      * @hide
   5347      */
   5348     public abstract ComponentName getHomeActivities(List<ResolveInfo> outActivities);
   5349 
   5350     /**
   5351      * Set the enabled setting for a package component (activity, receiver, service, provider).
   5352      * This setting will override any enabled state which may have been set by the component in its
   5353      * manifest.
   5354      *
   5355      * @param componentName The component to enable
   5356      * @param newState The new enabled state for the component.  The legal values for this state
   5357      *                 are:
   5358      *                   {@link #COMPONENT_ENABLED_STATE_ENABLED},
   5359      *                   {@link #COMPONENT_ENABLED_STATE_DISABLED}
   5360      *                   and
   5361      *                   {@link #COMPONENT_ENABLED_STATE_DEFAULT}
   5362      *                 The last one removes the setting, thereby restoring the component's state to
   5363      *                 whatever was set in it's manifest (or enabled, by default).
   5364      * @param flags Optional behavior flags: {@link #DONT_KILL_APP} or 0.
   5365      */
   5366     public abstract void setComponentEnabledSetting(ComponentName componentName,
   5367             int newState, int flags);
   5368 
   5369     /**
   5370      * Return the enabled setting for a package component (activity,
   5371      * receiver, service, provider).  This returns the last value set by
   5372      * {@link #setComponentEnabledSetting(ComponentName, int, int)}; in most
   5373      * cases this value will be {@link #COMPONENT_ENABLED_STATE_DEFAULT} since
   5374      * the value originally specified in the manifest has not been modified.
   5375      *
   5376      * @param componentName The component to retrieve.
   5377      * @return Returns the current enabled state for the component.  May
   5378      * be one of {@link #COMPONENT_ENABLED_STATE_ENABLED},
   5379      * {@link #COMPONENT_ENABLED_STATE_DISABLED}, or
   5380      * {@link #COMPONENT_ENABLED_STATE_DEFAULT}.  The last one means the
   5381      * component's enabled state is based on the original information in
   5382      * the manifest as found in {@link ComponentInfo}.
   5383      */
   5384     public abstract int getComponentEnabledSetting(ComponentName componentName);
   5385 
   5386     /**
   5387      * Set the enabled setting for an application
   5388      * This setting will override any enabled state which may have been set by the application in
   5389      * its manifest.  It also overrides the enabled state set in the manifest for any of the
   5390      * application's components.  It does not override any enabled state set by
   5391      * {@link #setComponentEnabledSetting} for any of the application's components.
   5392      *
   5393      * @param packageName The package name of the application to enable
   5394      * @param newState The new enabled state for the component.  The legal values for this state
   5395      *                 are:
   5396      *                   {@link #COMPONENT_ENABLED_STATE_ENABLED},
   5397      *                   {@link #COMPONENT_ENABLED_STATE_DISABLED}
   5398      *                   and
   5399      *                   {@link #COMPONENT_ENABLED_STATE_DEFAULT}
   5400      *                 The last one removes the setting, thereby restoring the applications's state to
   5401      *                 whatever was set in its manifest (or enabled, by default).
   5402      * @param flags Optional behavior flags: {@link #DONT_KILL_APP} or 0.
   5403      */
   5404     public abstract void setApplicationEnabledSetting(String packageName,
   5405             int newState, int flags);
   5406 
   5407     /**
   5408      * Return the enabled setting for an application. This returns
   5409      * the last value set by
   5410      * {@link #setApplicationEnabledSetting(String, int, int)}; in most
   5411      * cases this value will be {@link #COMPONENT_ENABLED_STATE_DEFAULT} since
   5412      * the value originally specified in the manifest has not been modified.
   5413      *
   5414      * @param packageName The package name of the application to retrieve.
   5415      * @return Returns the current enabled state for the application.  May
   5416      * be one of {@link #COMPONENT_ENABLED_STATE_ENABLED},
   5417      * {@link #COMPONENT_ENABLED_STATE_DISABLED}, or
   5418      * {@link #COMPONENT_ENABLED_STATE_DEFAULT}.  The last one means the
   5419      * application's enabled state is based on the original information in
   5420      * the manifest as found in {@link ComponentInfo}.
   5421      * @throws IllegalArgumentException if the named package does not exist.
   5422      */
   5423     public abstract int getApplicationEnabledSetting(String packageName);
   5424 
   5425     /**
   5426      * Flush the package restrictions for a given user to disk. This forces the package restrictions
   5427      * like component and package enabled settings to be written to disk and avoids the delay that
   5428      * is otherwise present when changing those settings.
   5429      *
   5430      * @param userId Ther userId of the user whose restrictions are to be flushed.
   5431      * @hide
   5432      */
   5433     public abstract void flushPackageRestrictionsAsUser(int userId);
   5434 
   5435     /**
   5436      * Puts the package in a hidden state, which is almost like an uninstalled state,
   5437      * making the package unavailable, but it doesn't remove the data or the actual
   5438      * package file. Application can be unhidden by either resetting the hidden state
   5439      * or by installing it, such as with {@link #installExistingPackage(String)}
   5440      * @hide
   5441      */
   5442     public abstract boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden,
   5443             UserHandle userHandle);
   5444 
   5445     /**
   5446      * Returns the hidden state of a package.
   5447      * @see #setApplicationHiddenSettingAsUser(String, boolean, UserHandle)
   5448      * @hide
   5449      */
   5450     public abstract boolean getApplicationHiddenSettingAsUser(String packageName,
   5451             UserHandle userHandle);
   5452 
   5453     /**
   5454      * Return whether the device has been booted into safe mode.
   5455      */
   5456     public abstract boolean isSafeMode();
   5457 
   5458     /**
   5459      * Adds a listener for permission changes for installed packages.
   5460      *
   5461      * @param listener The listener to add.
   5462      *
   5463      * @hide
   5464      */
   5465     @SystemApi
   5466     @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
   5467     public abstract void addOnPermissionsChangeListener(OnPermissionsChangedListener listener);
   5468 
   5469     /**
   5470      * Remvoes a listener for permission changes for installed packages.
   5471      *
   5472      * @param listener The listener to remove.
   5473      *
   5474      * @hide
   5475      */
   5476     @SystemApi
   5477     public abstract void removeOnPermissionsChangeListener(OnPermissionsChangedListener listener);
   5478 
   5479     /**
   5480      * Return the {@link KeySet} associated with the String alias for this
   5481      * application.
   5482      *
   5483      * @param alias The alias for a given {@link KeySet} as defined in the
   5484      *        application's AndroidManifest.xml.
   5485      * @hide
   5486      */
   5487     public abstract KeySet getKeySetByAlias(String packageName, String alias);
   5488 
   5489     /** Return the signing {@link KeySet} for this application.
   5490      * @hide
   5491      */
   5492     public abstract KeySet getSigningKeySet(String packageName);
   5493 
   5494     /**
   5495      * Return whether the package denoted by packageName has been signed by all
   5496      * of the keys specified by the {@link KeySet} ks.  This will return true if
   5497      * the package has been signed by additional keys (a superset) as well.
   5498      * Compare to {@link #isSignedByExactly(String packageName, KeySet ks)}.
   5499      * @hide
   5500      */
   5501     public abstract boolean isSignedBy(String packageName, KeySet ks);
   5502 
   5503     /**
   5504      * Return whether the package denoted by packageName has been signed by all
   5505      * of, and only, the keys specified by the {@link KeySet} ks. Compare to
   5506      * {@link #isSignedBy(String packageName, KeySet ks)}.
   5507      * @hide
   5508      */
   5509     public abstract boolean isSignedByExactly(String packageName, KeySet ks);
   5510 
   5511     /**
   5512      * Puts the package in a suspended state, where attempts at starting activities are denied.
   5513      *
   5514      * <p>It doesn't remove the data or the actual package file. The application notifications
   5515      * will be hidden, the application will not show up in recents, will not be able to show
   5516      * toasts or dialogs or ring the device.
   5517      *
   5518      * <p>The package must already be installed. If the package is uninstalled while suspended
   5519      * the package will no longer be suspended.
   5520      *
   5521      * @param packageNames The names of the packages to set the suspended status.
   5522      * @param suspended If set to {@code true} than the packages will be suspended, if set to
   5523      * {@code false} the packages will be unsuspended.
   5524      * @param userId The user id.
   5525      *
   5526      * @return an array of package names for which the suspended status is not set as requested in
   5527      * this method.
   5528      *
   5529      * @hide
   5530      */
   5531     public abstract String[] setPackagesSuspendedAsUser(
   5532             String[] packageNames, boolean suspended, @UserIdInt int userId);
   5533 
   5534     /**
   5535      * @see #setPackageSuspendedAsUser(String, boolean, int)
   5536      * @param packageName The name of the package to get the suspended status of.
   5537      * @param userId The user id.
   5538      * @return {@code true} if the package is suspended or {@code false} if the package is not
   5539      * suspended or could not be found.
   5540      * @hide
   5541      */
   5542     public abstract boolean isPackageSuspendedForUser(String packageName, int userId);
   5543 
   5544     /** {@hide} */
   5545     public static boolean isMoveStatusFinished(int status) {
   5546         return (status < 0 || status > 100);
   5547     }
   5548 
   5549     /** {@hide} */
   5550     public static abstract class MoveCallback {
   5551         public void onCreated(int moveId, Bundle extras) {}
   5552         public abstract void onStatusChanged(int moveId, int status, long estMillis);
   5553     }
   5554 
   5555     /** {@hide} */
   5556     public abstract int getMoveStatus(int moveId);
   5557 
   5558     /** {@hide} */
   5559     public abstract void registerMoveCallback(MoveCallback callback, Handler handler);
   5560     /** {@hide} */
   5561     public abstract void unregisterMoveCallback(MoveCallback callback);
   5562 
   5563     /** {@hide} */
   5564     public abstract int movePackage(String packageName, VolumeInfo vol);
   5565     /** {@hide} */
   5566     public abstract @Nullable VolumeInfo getPackageCurrentVolume(ApplicationInfo app);
   5567     /** {@hide} */
   5568     public abstract @NonNull List<VolumeInfo> getPackageCandidateVolumes(ApplicationInfo app);
   5569 
   5570     /** {@hide} */
   5571     public abstract int movePrimaryStorage(VolumeInfo vol);
   5572     /** {@hide} */
   5573     public abstract @Nullable VolumeInfo getPrimaryStorageCurrentVolume();
   5574     /** {@hide} */
   5575     public abstract @NonNull List<VolumeInfo> getPrimaryStorageCandidateVolumes();
   5576 
   5577     /**
   5578      * Returns the device identity that verifiers can use to associate their scheme to a particular
   5579      * device. This should not be used by anything other than a package verifier.
   5580      *
   5581      * @return identity that uniquely identifies current device
   5582      * @hide
   5583      */
   5584     public abstract VerifierDeviceIdentity getVerifierDeviceIdentity();
   5585 
   5586     /**
   5587      * Returns true if the device is upgrading, such as first boot after OTA.
   5588      *
   5589      * @hide
   5590      */
   5591     public abstract boolean isUpgrade();
   5592 
   5593     /**
   5594      * Return interface that offers the ability to install, upgrade, and remove
   5595      * applications on the device.
   5596      */
   5597     public abstract @NonNull PackageInstaller getPackageInstaller();
   5598 
   5599     /**
   5600      * Adds a {@code CrossProfileIntentFilter}. After calling this method all
   5601      * intents sent from the user with id sourceUserId can also be be resolved
   5602      * by activities in the user with id targetUserId if they match the
   5603      * specified intent filter.
   5604      *
   5605      * @param filter The {@link IntentFilter} the intent has to match
   5606      * @param sourceUserId The source user id.
   5607      * @param targetUserId The target user id.
   5608      * @param flags The possible values are {@link #SKIP_CURRENT_PROFILE} and
   5609      *            {@link #ONLY_IF_NO_MATCH_FOUND}.
   5610      * @hide
   5611      */
   5612     public abstract void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId,
   5613             int targetUserId, int flags);
   5614 
   5615     /**
   5616      * Clearing {@code CrossProfileIntentFilter}s which have the specified user
   5617      * as their source, and have been set by the app calling this method.
   5618      *
   5619      * @param sourceUserId The source user id.
   5620      * @hide
   5621      */
   5622     public abstract void clearCrossProfileIntentFilters(int sourceUserId);
   5623 
   5624     /**
   5625      * @hide
   5626      */
   5627     public abstract Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo);
   5628 
   5629     /**
   5630      * @hide
   5631      */
   5632     public abstract Drawable loadUnbadgedItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo);
   5633 
   5634     /** {@hide} */
   5635     public abstract boolean isPackageAvailable(String packageName);
   5636 
   5637     /** {@hide} */
   5638     public static String installStatusToString(int status, String msg) {
   5639         final String str = installStatusToString(status);
   5640         if (msg != null) {
   5641             return str + ": " + msg;
   5642         } else {
   5643             return str;
   5644         }
   5645     }
   5646 
   5647     /** {@hide} */
   5648     public static String installStatusToString(int status) {
   5649         switch (status) {
   5650             case INSTALL_SUCCEEDED: return "INSTALL_SUCCEEDED";
   5651             case INSTALL_FAILED_ALREADY_EXISTS: return "INSTALL_FAILED_ALREADY_EXISTS";
   5652             case INSTALL_FAILED_INVALID_APK: return "INSTALL_FAILED_INVALID_APK";
   5653             case INSTALL_FAILED_INVALID_URI: return "INSTALL_FAILED_INVALID_URI";
   5654             case INSTALL_FAILED_INSUFFICIENT_STORAGE: return "INSTALL_FAILED_INSUFFICIENT_STORAGE";
   5655             case INSTALL_FAILED_DUPLICATE_PACKAGE: return "INSTALL_FAILED_DUPLICATE_PACKAGE";
   5656             case INSTALL_FAILED_NO_SHARED_USER: return "INSTALL_FAILED_NO_SHARED_USER";
   5657             case INSTALL_FAILED_UPDATE_INCOMPATIBLE: return "INSTALL_FAILED_UPDATE_INCOMPATIBLE";
   5658             case INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: return "INSTALL_FAILED_SHARED_USER_INCOMPATIBLE";
   5659             case INSTALL_FAILED_MISSING_SHARED_LIBRARY: return "INSTALL_FAILED_MISSING_SHARED_LIBRARY";
   5660             case INSTALL_FAILED_REPLACE_COULDNT_DELETE: return "INSTALL_FAILED_REPLACE_COULDNT_DELETE";
   5661             case INSTALL_FAILED_DEXOPT: return "INSTALL_FAILED_DEXOPT";
   5662             case INSTALL_FAILED_OLDER_SDK: return "INSTALL_FAILED_OLDER_SDK";
   5663             case INSTALL_FAILED_CONFLICTING_PROVIDER: return "INSTALL_FAILED_CONFLICTING_PROVIDER";
   5664             case INSTALL_FAILED_NEWER_SDK: return "INSTALL_FAILED_NEWER_SDK";
   5665             case INSTALL_FAILED_TEST_ONLY: return "INSTALL_FAILED_TEST_ONLY";
   5666             case INSTALL_FAILED_CPU_ABI_INCOMPATIBLE: return "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE";
   5667             case INSTALL_FAILED_MISSING_FEATURE: return "INSTALL_FAILED_MISSING_FEATURE";
   5668             case INSTALL_FAILED_CONTAINER_ERROR: return "INSTALL_FAILED_CONTAINER_ERROR";
   5669             case INSTALL_FAILED_INVALID_INSTALL_LOCATION: return "INSTALL_FAILED_INVALID_INSTALL_LOCATION";
   5670             case INSTALL_FAILED_MEDIA_UNAVAILABLE: return "INSTALL_FAILED_MEDIA_UNAVAILABLE";
   5671             case INSTALL_FAILED_VERIFICATION_TIMEOUT: return "INSTALL_FAILED_VERIFICATION_TIMEOUT";
   5672             case INSTALL_FAILED_VERIFICATION_FAILURE: return "INSTALL_FAILED_VERIFICATION_FAILURE";
   5673             case INSTALL_FAILED_PACKAGE_CHANGED: return "INSTALL_FAILED_PACKAGE_CHANGED";
   5674             case INSTALL_FAILED_UID_CHANGED: return "INSTALL_FAILED_UID_CHANGED";
   5675             case INSTALL_FAILED_VERSION_DOWNGRADE: return "INSTALL_FAILED_VERSION_DOWNGRADE";
   5676             case INSTALL_PARSE_FAILED_NOT_APK: return "INSTALL_PARSE_FAILED_NOT_APK";
   5677             case INSTALL_PARSE_FAILED_BAD_MANIFEST: return "INSTALL_PARSE_FAILED_BAD_MANIFEST";
   5678             case INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: return "INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION";
   5679             case INSTALL_PARSE_FAILED_NO_CERTIFICATES: return "INSTALL_PARSE_FAILED_NO_CERTIFICATES";
   5680             case INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES: return "INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES";
   5681             case INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING: return "INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING";
   5682             case INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME: return "INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME";
   5683             case INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID: return "INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID";
   5684             case INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: return "INSTALL_PARSE_FAILED_MANIFEST_MALFORMED";
   5685             case INSTALL_PARSE_FAILED_MANIFEST_EMPTY: return "INSTALL_PARSE_FAILED_MANIFEST_EMPTY";
   5686             case INSTALL_FAILED_INTERNAL_ERROR: return "INSTALL_FAILED_INTERNAL_ERROR";
   5687             case INSTALL_FAILED_USER_RESTRICTED: return "INSTALL_FAILED_USER_RESTRICTED";
   5688             case INSTALL_FAILED_DUPLICATE_PERMISSION: return "INSTALL_FAILED_DUPLICATE_PERMISSION";
   5689             case INSTALL_FAILED_NO_MATCHING_ABIS: return "INSTALL_FAILED_NO_MATCHING_ABIS";
   5690             case INSTALL_FAILED_ABORTED: return "INSTALL_FAILED_ABORTED";
   5691             default: return Integer.toString(status);
   5692         }
   5693     }
   5694 
   5695     /** {@hide} */
   5696     public static int installStatusToPublicStatus(int status) {
   5697         switch (status) {
   5698             case INSTALL_SUCCEEDED: return PackageInstaller.STATUS_SUCCESS;
   5699             case INSTALL_FAILED_ALREADY_EXISTS: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5700             case INSTALL_FAILED_INVALID_APK: return PackageInstaller.STATUS_FAILURE_INVALID;
   5701             case INSTALL_FAILED_INVALID_URI: return PackageInstaller.STATUS_FAILURE_INVALID;
   5702             case INSTALL_FAILED_INSUFFICIENT_STORAGE: return PackageInstaller.STATUS_FAILURE_STORAGE;
   5703             case INSTALL_FAILED_DUPLICATE_PACKAGE: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5704             case INSTALL_FAILED_NO_SHARED_USER: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5705             case INSTALL_FAILED_UPDATE_INCOMPATIBLE: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5706             case INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5707             case INSTALL_FAILED_MISSING_SHARED_LIBRARY: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE;
   5708             case INSTALL_FAILED_REPLACE_COULDNT_DELETE: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5709             case INSTALL_FAILED_DEXOPT: return PackageInstaller.STATUS_FAILURE_INVALID;
   5710             case INSTALL_FAILED_OLDER_SDK: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE;
   5711             case INSTALL_FAILED_CONFLICTING_PROVIDER: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5712             case INSTALL_FAILED_NEWER_SDK: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE;
   5713             case INSTALL_FAILED_TEST_ONLY: return PackageInstaller.STATUS_FAILURE_INVALID;
   5714             case INSTALL_FAILED_CPU_ABI_INCOMPATIBLE: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE;
   5715             case INSTALL_FAILED_MISSING_FEATURE: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE;
   5716             case INSTALL_FAILED_CONTAINER_ERROR: return PackageInstaller.STATUS_FAILURE_STORAGE;
   5717             case INSTALL_FAILED_INVALID_INSTALL_LOCATION: return PackageInstaller.STATUS_FAILURE_STORAGE;
   5718             case INSTALL_FAILED_MEDIA_UNAVAILABLE: return PackageInstaller.STATUS_FAILURE_STORAGE;
   5719             case INSTALL_FAILED_VERIFICATION_TIMEOUT: return PackageInstaller.STATUS_FAILURE_ABORTED;
   5720             case INSTALL_FAILED_VERIFICATION_FAILURE: return PackageInstaller.STATUS_FAILURE_ABORTED;
   5721             case INSTALL_FAILED_PACKAGE_CHANGED: return PackageInstaller.STATUS_FAILURE_INVALID;
   5722             case INSTALL_FAILED_UID_CHANGED: return PackageInstaller.STATUS_FAILURE_INVALID;
   5723             case INSTALL_FAILED_VERSION_DOWNGRADE: return PackageInstaller.STATUS_FAILURE_INVALID;
   5724             case INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE: return PackageInstaller.STATUS_FAILURE_INVALID;
   5725             case INSTALL_PARSE_FAILED_NOT_APK: return PackageInstaller.STATUS_FAILURE_INVALID;
   5726             case INSTALL_PARSE_FAILED_BAD_MANIFEST: return PackageInstaller.STATUS_FAILURE_INVALID;
   5727             case INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: return PackageInstaller.STATUS_FAILURE_INVALID;
   5728             case INSTALL_PARSE_FAILED_NO_CERTIFICATES: return PackageInstaller.STATUS_FAILURE_INVALID;
   5729             case INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES: return PackageInstaller.STATUS_FAILURE_INVALID;
   5730             case INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING: return PackageInstaller.STATUS_FAILURE_INVALID;
   5731             case INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME: return PackageInstaller.STATUS_FAILURE_INVALID;
   5732             case INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID: return PackageInstaller.STATUS_FAILURE_INVALID;
   5733             case INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: return PackageInstaller.STATUS_FAILURE_INVALID;
   5734             case INSTALL_PARSE_FAILED_MANIFEST_EMPTY: return PackageInstaller.STATUS_FAILURE_INVALID;
   5735             case INSTALL_FAILED_INTERNAL_ERROR: return PackageInstaller.STATUS_FAILURE;
   5736             case INSTALL_FAILED_USER_RESTRICTED: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE;
   5737             case INSTALL_FAILED_DUPLICATE_PERMISSION: return PackageInstaller.STATUS_FAILURE_CONFLICT;
   5738             case INSTALL_FAILED_NO_MATCHING_ABIS: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE;
   5739             case INSTALL_FAILED_ABORTED: return PackageInstaller.STATUS_FAILURE_ABORTED;
   5740             default: return PackageInstaller.STATUS_FAILURE;
   5741         }
   5742     }
   5743 
   5744     /** {@hide} */
   5745     public static String deleteStatusToString(int status, String msg) {
   5746         final String str = deleteStatusToString(status);
   5747         if (msg != null) {
   5748             return str + ": " + msg;
   5749         } else {
   5750             return str;
   5751         }
   5752     }
   5753 
   5754     /** {@hide} */
   5755     public static String deleteStatusToString(int status) {
   5756         switch (status) {
   5757             case DELETE_SUCCEEDED: return "DELETE_SUCCEEDED";
   5758             case DELETE_FAILED_INTERNAL_ERROR: return "DELETE_FAILED_INTERNAL_ERROR";
   5759             case DELETE_FAILED_DEVICE_POLICY_MANAGER: return "DELETE_FAILED_DEVICE_POLICY_MANAGER";
   5760             case DELETE_FAILED_USER_RESTRICTED: return "DELETE_FAILED_USER_RESTRICTED";
   5761             case DELETE_FAILED_OWNER_BLOCKED: return "DELETE_FAILED_OWNER_BLOCKED";
   5762             case DELETE_FAILED_ABORTED: return "DELETE_FAILED_ABORTED";
   5763             default: return Integer.toString(status);
   5764         }
   5765     }
   5766 
   5767     /** {@hide} */
   5768     public static int deleteStatusToPublicStatus(int status) {
   5769         switch (status) {
   5770             case DELETE_SUCCEEDED: return PackageInstaller.STATUS_SUCCESS;
   5771             case DELETE_FAILED_INTERNAL_ERROR: return PackageInstaller.STATUS_FAILURE;
   5772             case DELETE_FAILED_DEVICE_POLICY_MANAGER: return PackageInstaller.STATUS_FAILURE_BLOCKED;
   5773             case DELETE_FAILED_USER_RESTRICTED: return PackageInstaller.STATUS_FAILURE_BLOCKED;
   5774             case DELETE_FAILED_OWNER_BLOCKED: return PackageInstaller.STATUS_FAILURE_BLOCKED;
   5775             case DELETE_FAILED_ABORTED: return PackageInstaller.STATUS_FAILURE_ABORTED;
   5776             default: return PackageInstaller.STATUS_FAILURE;
   5777         }
   5778     }
   5779 
   5780     /** {@hide} */
   5781     public static String permissionFlagToString(int flag) {
   5782         switch (flag) {
   5783             case FLAG_PERMISSION_GRANTED_BY_DEFAULT: return "GRANTED_BY_DEFAULT";
   5784             case FLAG_PERMISSION_POLICY_FIXED: return "POLICY_FIXED";
   5785             case FLAG_PERMISSION_SYSTEM_FIXED: return "SYSTEM_FIXED";
   5786             case FLAG_PERMISSION_USER_SET: return "USER_SET";
   5787             case FLAG_PERMISSION_REVOKE_ON_UPGRADE: return "REVOKE_ON_UPGRADE";
   5788             case FLAG_PERMISSION_USER_FIXED: return "USER_FIXED";
   5789             case FLAG_PERMISSION_REVIEW_REQUIRED: return "REVIEW_REQUIRED";
   5790             default: return Integer.toString(flag);
   5791         }
   5792     }
   5793 
   5794     /** {@hide} */
   5795     public static class LegacyPackageInstallObserver extends PackageInstallObserver {
   5796         private final IPackageInstallObserver mLegacy;
   5797 
   5798         public LegacyPackageInstallObserver(IPackageInstallObserver legacy) {
   5799             mLegacy = legacy;
   5800         }
   5801 
   5802         @Override
   5803         public void onPackageInstalled(String basePackageName, int returnCode, String msg,
   5804                 Bundle extras) {
   5805             if (mLegacy == null) return;
   5806             try {
   5807                 mLegacy.packageInstalled(basePackageName, returnCode);
   5808             } catch (RemoteException ignored) {
   5809             }
   5810         }
   5811     }
   5812 
   5813     /** {@hide} */
   5814     public static class LegacyPackageDeleteObserver extends PackageDeleteObserver {
   5815         private final IPackageDeleteObserver mLegacy;
   5816 
   5817         public LegacyPackageDeleteObserver(IPackageDeleteObserver legacy) {
   5818             mLegacy = legacy;
   5819         }
   5820 
   5821         @Override
   5822         public void onPackageDeleted(String basePackageName, int returnCode, String msg) {
   5823             if (mLegacy == null) return;
   5824             try {
   5825                 mLegacy.packageDeleted(basePackageName, returnCode);
   5826             } catch (RemoteException ignored) {
   5827             }
   5828         }
   5829     }
   5830 }
   5831