Home | History | Annotate | Download | only in pm
      1 /*
      2  * Copyright (C) 2007 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.os.Parcel;
     20 import android.os.Parcelable;
     21 
     22 /**
     23  * Overall information about the contents of a package.  This corresponds
     24  * to all of the information collected from AndroidManifest.xml.
     25  */
     26 public class PackageInfo implements Parcelable {
     27     /**
     28      * The name of this package.  From the <manifest> tag's "name"
     29      * attribute.
     30      */
     31     public String packageName;
     32 
     33     /**
     34      * The names of any installed split APKs for this package.
     35      */
     36     public String[] splitNames;
     37 
     38     /**
     39      * The version number of this package, as specified by the <manifest>
     40      * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCode}
     41      * attribute.
     42      */
     43     public int versionCode;
     44 
     45     /**
     46      * The version name of this package, as specified by the <manifest>
     47      * tag's {@link android.R.styleable#AndroidManifest_versionName versionName}
     48      * attribute.
     49      */
     50     public String versionName;
     51 
     52     /**
     53      * The shared user ID name of this package, as specified by the <manifest>
     54      * tag's {@link android.R.styleable#AndroidManifest_sharedUserId sharedUserId}
     55      * attribute.
     56      */
     57     public String sharedUserId;
     58 
     59     /**
     60      * The shared user ID label of this package, as specified by the <manifest>
     61      * tag's {@link android.R.styleable#AndroidManifest_sharedUserLabel sharedUserLabel}
     62      * attribute.
     63      */
     64     public int sharedUserLabel;
     65 
     66     /**
     67      * Information collected from the <application> tag, or null if
     68      * there was none.
     69      */
     70     public ApplicationInfo applicationInfo;
     71 
     72     /**
     73      * The time at which the app was first installed.  Units are as
     74      * per {@link System#currentTimeMillis()}.
     75      */
     76     public long firstInstallTime;
     77 
     78     /**
     79      * The time at which the app was last updated.  Units are as
     80      * per {@link System#currentTimeMillis()}.
     81      */
     82     public long lastUpdateTime;
     83 
     84     /**
     85      * All kernel group-IDs that have been assigned to this package.
     86      * This is only filled in if the flag {@link PackageManager#GET_GIDS} was set.
     87      */
     88     public int[] gids;
     89 
     90     /**
     91      * Array of all {@link android.R.styleable#AndroidManifestActivity
     92      * <activity>} tags included under <application>,
     93      * or null if there were none.  This is only filled in if the flag
     94      * {@link PackageManager#GET_ACTIVITIES} was set.
     95      */
     96     public ActivityInfo[] activities;
     97 
     98     /**
     99      * Array of all {@link android.R.styleable#AndroidManifestReceiver
    100      * <receiver>} tags included under <application>,
    101      * or null if there were none.  This is only filled in if the flag
    102      * {@link PackageManager#GET_RECEIVERS} was set.
    103      */
    104     public ActivityInfo[] receivers;
    105 
    106     /**
    107      * Array of all {@link android.R.styleable#AndroidManifestService
    108      * <service>} tags included under <application>,
    109      * or null if there were none.  This is only filled in if the flag
    110      * {@link PackageManager#GET_SERVICES} was set.
    111      */
    112     public ServiceInfo[] services;
    113 
    114     /**
    115      * Array of all {@link android.R.styleable#AndroidManifestProvider
    116      * <provider>} tags included under <application>,
    117      * or null if there were none.  This is only filled in if the flag
    118      * {@link PackageManager#GET_PROVIDERS} was set.
    119      */
    120     public ProviderInfo[] providers;
    121 
    122     /**
    123      * Array of all {@link android.R.styleable#AndroidManifestInstrumentation
    124      * <instrumentation>} tags included under <manifest>,
    125      * or null if there were none.  This is only filled in if the flag
    126      * {@link PackageManager#GET_INSTRUMENTATION} was set.
    127      */
    128     public InstrumentationInfo[] instrumentation;
    129 
    130     /**
    131      * Array of all {@link android.R.styleable#AndroidManifestPermission
    132      * <permission>} tags included under <manifest>,
    133      * or null if there were none.  This is only filled in if the flag
    134      * {@link PackageManager#GET_PERMISSIONS} was set.
    135      */
    136     public PermissionInfo[] permissions;
    137 
    138     /**
    139      * Array of all {@link android.R.styleable#AndroidManifestUsesPermission
    140      * <uses-permission>} tags included under <manifest>,
    141      * or null if there were none.  This is only filled in if the flag
    142      * {@link PackageManager#GET_PERMISSIONS} was set.  This list includes
    143      * all permissions requested, even those that were not granted or known
    144      * by the system at install time.
    145      */
    146     public String[] requestedPermissions;
    147 
    148     /**
    149      * Array of flags of all {@link android.R.styleable#AndroidManifestUsesPermission
    150      * <uses-permission>} tags included under <manifest>,
    151      * or null if there were none.  This is only filled in if the flag
    152      * {@link PackageManager#GET_PERMISSIONS} was set.  Each value matches
    153      * the corresponding entry in {@link #requestedPermissions}, and will have
    154      * the flags {@link #REQUESTED_PERMISSION_REQUIRED} and
    155      * {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate.
    156      */
    157     public int[] requestedPermissionsFlags;
    158 
    159     /**
    160      * Flag for {@link #requestedPermissionsFlags}: the requested permission
    161      * is required for the application to run; the user can not optionally
    162      * disable it.  Currently all permissions are required.
    163      */
    164     public static final int REQUESTED_PERMISSION_REQUIRED = 1<<0;
    165 
    166     /**
    167      * Flag for {@link #requestedPermissionsFlags}: the requested permission
    168      * is currently granted to the application.
    169      */
    170     public static final int REQUESTED_PERMISSION_GRANTED = 1<<1;
    171 
    172     /**
    173      * Array of all signatures read from the package file.  This is only filled
    174      * in if the flag {@link PackageManager#GET_SIGNATURES} was set.
    175      */
    176     public Signature[] signatures;
    177 
    178     /**
    179      * Application specified preferred configuration
    180      * {@link android.R.styleable#AndroidManifestUsesConfiguration
    181      * &lt;uses-configuration&gt;} tags included under &lt;manifest&gt;,
    182      * or null if there were none. This is only filled in if the flag
    183      * {@link PackageManager#GET_CONFIGURATIONS} was set.
    184      */
    185     public ConfigurationInfo[] configPreferences;
    186 
    187     /**
    188      * Features that this application has requested.
    189      *
    190      * @see FeatureInfo#FLAG_REQUIRED
    191      */
    192     public FeatureInfo[] reqFeatures;
    193 
    194     /**
    195      * Groups of features that this application has requested.
    196      * Each group contains a set of features that are required.
    197      * A device must match the features listed in {@link #reqFeatures} and one
    198      * or more FeatureGroups in order to have satisfied the feature requirement.
    199      *
    200      * @see FeatureInfo#FLAG_REQUIRED
    201      */
    202     public FeatureGroupInfo[] featureGroups;
    203 
    204     /**
    205      * Constant corresponding to <code>auto</code> in
    206      * the {@link android.R.attr#installLocation} attribute.
    207      * @hide
    208      */
    209     public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
    210 
    211     /**
    212      * Constant corresponding to <code>auto</code> in the
    213      * {@link android.R.attr#installLocation} attribute.
    214      */
    215     public static final int INSTALL_LOCATION_AUTO = 0;
    216 
    217     /**
    218      * Constant corresponding to <code>internalOnly</code> in the
    219      * {@link android.R.attr#installLocation} attribute.
    220      */
    221     public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
    222 
    223     /**
    224      * Constant corresponding to <code>preferExternal</code> in the
    225      * {@link android.R.attr#installLocation} attribute.
    226      */
    227     public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
    228 
    229     /**
    230      * The install location requested by the package. From the
    231      * {@link android.R.attr#installLocation} attribute, one of
    232      * {@link #INSTALL_LOCATION_AUTO}, {@link #INSTALL_LOCATION_INTERNAL_ONLY},
    233      * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
    234      */
    235     public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
    236 
    237     /** @hide */
    238     public boolean coreApp;
    239 
    240     /** @hide */
    241     public boolean requiredForAllUsers;
    242 
    243     /** @hide */
    244     public String restrictedAccountType;
    245 
    246     /** @hide */
    247     public String requiredAccountType;
    248 
    249     /**
    250      * What package, if any, this package will overlay.
    251      *
    252      * Package name of target package, or null.
    253      * @hide
    254      */
    255     public String overlayTarget;
    256 
    257     public PackageInfo() {
    258     }
    259 
    260     public String toString() {
    261         return "PackageInfo{"
    262             + Integer.toHexString(System.identityHashCode(this))
    263             + " " + packageName + "}";
    264     }
    265 
    266     public int describeContents() {
    267         return 0;
    268     }
    269 
    270     public void writeToParcel(Parcel dest, int parcelableFlags) {
    271         dest.writeString(packageName);
    272         dest.writeStringArray(splitNames);
    273         dest.writeInt(versionCode);
    274         dest.writeString(versionName);
    275         dest.writeString(sharedUserId);
    276         dest.writeInt(sharedUserLabel);
    277         if (applicationInfo != null) {
    278             dest.writeInt(1);
    279             applicationInfo.writeToParcel(dest, parcelableFlags);
    280         } else {
    281             dest.writeInt(0);
    282         }
    283         dest.writeLong(firstInstallTime);
    284         dest.writeLong(lastUpdateTime);
    285         dest.writeIntArray(gids);
    286         dest.writeTypedArray(activities, parcelableFlags);
    287         dest.writeTypedArray(receivers, parcelableFlags);
    288         dest.writeTypedArray(services, parcelableFlags);
    289         dest.writeTypedArray(providers, parcelableFlags);
    290         dest.writeTypedArray(instrumentation, parcelableFlags);
    291         dest.writeTypedArray(permissions, parcelableFlags);
    292         dest.writeStringArray(requestedPermissions);
    293         dest.writeIntArray(requestedPermissionsFlags);
    294         dest.writeTypedArray(signatures, parcelableFlags);
    295         dest.writeTypedArray(configPreferences, parcelableFlags);
    296         dest.writeTypedArray(reqFeatures, parcelableFlags);
    297         dest.writeTypedArray(featureGroups, parcelableFlags);
    298         dest.writeInt(installLocation);
    299         dest.writeInt(coreApp ? 1 : 0);
    300         dest.writeInt(requiredForAllUsers ? 1 : 0);
    301         dest.writeString(restrictedAccountType);
    302         dest.writeString(requiredAccountType);
    303         dest.writeString(overlayTarget);
    304     }
    305 
    306     public static final Parcelable.Creator<PackageInfo> CREATOR
    307             = new Parcelable.Creator<PackageInfo>() {
    308         public PackageInfo createFromParcel(Parcel source) {
    309             return new PackageInfo(source);
    310         }
    311 
    312         public PackageInfo[] newArray(int size) {
    313             return new PackageInfo[size];
    314         }
    315     };
    316 
    317     private PackageInfo(Parcel source) {
    318         packageName = source.readString();
    319         splitNames = source.readStringArray();
    320         versionCode = source.readInt();
    321         versionName = source.readString();
    322         sharedUserId = source.readString();
    323         sharedUserLabel = source.readInt();
    324         int hasApp = source.readInt();
    325         if (hasApp != 0) {
    326             applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
    327         }
    328         firstInstallTime = source.readLong();
    329         lastUpdateTime = source.readLong();
    330         gids = source.createIntArray();
    331         activities = source.createTypedArray(ActivityInfo.CREATOR);
    332         receivers = source.createTypedArray(ActivityInfo.CREATOR);
    333         services = source.createTypedArray(ServiceInfo.CREATOR);
    334         providers = source.createTypedArray(ProviderInfo.CREATOR);
    335         instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
    336         permissions = source.createTypedArray(PermissionInfo.CREATOR);
    337         requestedPermissions = source.createStringArray();
    338         requestedPermissionsFlags = source.createIntArray();
    339         signatures = source.createTypedArray(Signature.CREATOR);
    340         configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
    341         reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
    342         featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
    343         installLocation = source.readInt();
    344         coreApp = source.readInt() != 0;
    345         requiredForAllUsers = source.readInt() != 0;
    346         restrictedAccountType = source.readString();
    347         requiredAccountType = source.readString();
    348         overlayTarget = source.readString();
    349     }
    350 }
    351