PackageInfo.java revision 6d248493878b1280e13be82e3e02a5ea42949555
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
17package android.content.pm;
18
19import android.os.Parcel;
20import 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 */
26public 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 requiredForAllUsers;
239
240    /** @hide */
241    public String restrictedAccountType;
242
243    /** @hide */
244    public String requiredAccountType;
245
246    /**
247     * What package, if any, this package will overlay.
248     *
249     * Package name of target package, or null.
250     * @hide
251     */
252    public String overlayTarget;
253
254    public PackageInfo() {
255    }
256
257    public String toString() {
258        return "PackageInfo{"
259            + Integer.toHexString(System.identityHashCode(this))
260            + " " + packageName + "}";
261    }
262
263    public int describeContents() {
264        return 0;
265    }
266
267    public void writeToParcel(Parcel dest, int parcelableFlags) {
268        dest.writeString(packageName);
269        dest.writeStringArray(splitNames);
270        dest.writeInt(versionCode);
271        dest.writeString(versionName);
272        dest.writeString(sharedUserId);
273        dest.writeInt(sharedUserLabel);
274        if (applicationInfo != null) {
275            dest.writeInt(1);
276            applicationInfo.writeToParcel(dest, parcelableFlags);
277        } else {
278            dest.writeInt(0);
279        }
280        dest.writeLong(firstInstallTime);
281        dest.writeLong(lastUpdateTime);
282        dest.writeIntArray(gids);
283        dest.writeTypedArray(activities, parcelableFlags);
284        dest.writeTypedArray(receivers, parcelableFlags);
285        dest.writeTypedArray(services, parcelableFlags);
286        dest.writeTypedArray(providers, parcelableFlags);
287        dest.writeTypedArray(instrumentation, parcelableFlags);
288        dest.writeTypedArray(permissions, parcelableFlags);
289        dest.writeStringArray(requestedPermissions);
290        dest.writeIntArray(requestedPermissionsFlags);
291        dest.writeTypedArray(signatures, parcelableFlags);
292        dest.writeTypedArray(configPreferences, parcelableFlags);
293        dest.writeTypedArray(reqFeatures, parcelableFlags);
294        dest.writeTypedArray(featureGroups, parcelableFlags);
295        dest.writeInt(installLocation);
296        dest.writeInt(requiredForAllUsers ? 1 : 0);
297        dest.writeString(restrictedAccountType);
298        dest.writeString(requiredAccountType);
299        dest.writeString(overlayTarget);
300    }
301
302    public static final Parcelable.Creator<PackageInfo> CREATOR
303            = new Parcelable.Creator<PackageInfo>() {
304        public PackageInfo createFromParcel(Parcel source) {
305            return new PackageInfo(source);
306        }
307
308        public PackageInfo[] newArray(int size) {
309            return new PackageInfo[size];
310        }
311    };
312
313    private PackageInfo(Parcel source) {
314        packageName = source.readString();
315        splitNames = source.readStringArray();
316        versionCode = source.readInt();
317        versionName = source.readString();
318        sharedUserId = source.readString();
319        sharedUserLabel = source.readInt();
320        int hasApp = source.readInt();
321        if (hasApp != 0) {
322            applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
323        }
324        firstInstallTime = source.readLong();
325        lastUpdateTime = source.readLong();
326        gids = source.createIntArray();
327        activities = source.createTypedArray(ActivityInfo.CREATOR);
328        receivers = source.createTypedArray(ActivityInfo.CREATOR);
329        services = source.createTypedArray(ServiceInfo.CREATOR);
330        providers = source.createTypedArray(ProviderInfo.CREATOR);
331        instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
332        permissions = source.createTypedArray(PermissionInfo.CREATOR);
333        requestedPermissions = source.createStringArray();
334        requestedPermissionsFlags = source.createIntArray();
335        signatures = source.createTypedArray(Signature.CREATOR);
336        configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
337        reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
338        featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
339        installLocation = source.readInt();
340        requiredForAllUsers = source.readInt() != 0;
341        restrictedAccountType = source.readString();
342        requiredAccountType = source.readString();
343        overlayTarget = source.readString();
344    }
345}
346