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