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