PackageInfo.java revision 6c833e07a05c48ca60ee4d72421bf8b1e78dc710
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     * The features that this application has said it requires.
189     */
190    public FeatureInfo[] reqFeatures;
191
192    /**
193     * Constant corresponding to <code>auto</code> in
194     * the {@link android.R.attr#installLocation} attribute.
195     * @hide
196     */
197    public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
198
199    /**
200     * Constant corresponding to <code>auto</code> in the
201     * {@link android.R.attr#installLocation} attribute.
202     */
203    public static final int INSTALL_LOCATION_AUTO = 0;
204
205    /**
206     * Constant corresponding to <code>internalOnly</code> in the
207     * {@link android.R.attr#installLocation} attribute.
208     */
209    public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
210
211    /**
212     * Constant corresponding to <code>preferExternal</code> in the
213     * {@link android.R.attr#installLocation} attribute.
214     */
215    public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
216
217    /**
218     * Flag for {@link #requiredForProfile}
219     * The application will always be installed for a restricted profile.
220     * @hide
221     */
222    public static final int RESTRICTED_PROFILE = 1;
223    /**
224     * Flag for {@link #requiredForProfile}
225     * The application will always be installed for a managed profile.
226     * @hide
227     */
228    public static final int MANAGED_PROFILE = 2;
229
230    /**
231     * The install location requested by the package. From the
232     * {@link android.R.attr#installLocation} attribute, one of
233     * {@link #INSTALL_LOCATION_AUTO}, {@link #INSTALL_LOCATION_INTERNAL_ONLY},
234     * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
235     */
236    public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
237
238    /**
239     * Defines which profiles this app is required for.
240     * @hide
241     */
242    public int requiredForProfile;
243
244    /** @hide */
245    public boolean requiredForAllUsers;
246
247    /** @hide */
248    public String restrictedAccountType;
249
250    /** @hide */
251    public String requiredAccountType;
252
253    /**
254     * What package, if any, this package will overlay.
255     *
256     * Package name of target package, or null.
257     * @hide
258     */
259    public String overlayTarget;
260
261    public PackageInfo() {
262    }
263
264    public String toString() {
265        return "PackageInfo{"
266            + Integer.toHexString(System.identityHashCode(this))
267            + " " + packageName + "}";
268    }
269
270    public int describeContents() {
271        return 0;
272    }
273
274    public void writeToParcel(Parcel dest, int parcelableFlags) {
275        dest.writeString(packageName);
276        dest.writeStringArray(splitNames);
277        dest.writeInt(versionCode);
278        dest.writeString(versionName);
279        dest.writeString(sharedUserId);
280        dest.writeInt(sharedUserLabel);
281        if (applicationInfo != null) {
282            dest.writeInt(1);
283            applicationInfo.writeToParcel(dest, parcelableFlags);
284        } else {
285            dest.writeInt(0);
286        }
287        dest.writeLong(firstInstallTime);
288        dest.writeLong(lastUpdateTime);
289        dest.writeIntArray(gids);
290        dest.writeTypedArray(activities, parcelableFlags);
291        dest.writeTypedArray(receivers, parcelableFlags);
292        dest.writeTypedArray(services, parcelableFlags);
293        dest.writeTypedArray(providers, parcelableFlags);
294        dest.writeTypedArray(instrumentation, parcelableFlags);
295        dest.writeTypedArray(permissions, parcelableFlags);
296        dest.writeStringArray(requestedPermissions);
297        dest.writeIntArray(requestedPermissionsFlags);
298        dest.writeTypedArray(signatures, parcelableFlags);
299        dest.writeTypedArray(configPreferences, parcelableFlags);
300        dest.writeTypedArray(reqFeatures, parcelableFlags);
301        dest.writeInt(installLocation);
302        dest.writeInt(requiredForAllUsers ? 1 : 0);
303        dest.writeInt(requiredForProfile);
304        dest.writeString(restrictedAccountType);
305        dest.writeString(requiredAccountType);
306        dest.writeString(overlayTarget);
307    }
308
309    public static final Parcelable.Creator<PackageInfo> CREATOR
310            = new Parcelable.Creator<PackageInfo>() {
311        public PackageInfo createFromParcel(Parcel source) {
312            return new PackageInfo(source);
313        }
314
315        public PackageInfo[] newArray(int size) {
316            return new PackageInfo[size];
317        }
318    };
319
320    private PackageInfo(Parcel source) {
321        packageName = source.readString();
322        splitNames = source.readStringArray();
323        versionCode = source.readInt();
324        versionName = source.readString();
325        sharedUserId = source.readString();
326        sharedUserLabel = source.readInt();
327        int hasApp = source.readInt();
328        if (hasApp != 0) {
329            applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
330        }
331        firstInstallTime = source.readLong();
332        lastUpdateTime = source.readLong();
333        gids = source.createIntArray();
334        activities = source.createTypedArray(ActivityInfo.CREATOR);
335        receivers = source.createTypedArray(ActivityInfo.CREATOR);
336        services = source.createTypedArray(ServiceInfo.CREATOR);
337        providers = source.createTypedArray(ProviderInfo.CREATOR);
338        instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
339        permissions = source.createTypedArray(PermissionInfo.CREATOR);
340        requestedPermissions = source.createStringArray();
341        requestedPermissionsFlags = source.createIntArray();
342        signatures = source.createTypedArray(Signature.CREATOR);
343        configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
344        reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
345        installLocation = source.readInt();
346        requiredForAllUsers = source.readInt() != 0;
347        requiredForProfile = source.readInt();
348        restrictedAccountType = source.readString();
349        requiredAccountType = source.readString();
350        overlayTarget = source.readString();
351    }
352}
353