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 flag {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate.
171     */
172    public int[] requestedPermissionsFlags;
173
174    /**
175     * Flag for {@link #requestedPermissionsFlags}: the requested permission
176     * is required for the application to run; the user can not optionally
177     * disable it.  Currently all permissions are required.
178     *
179     * @removed We do not support required permissions.
180     */
181    public static final int REQUESTED_PERMISSION_REQUIRED = 1<<0;
182
183    /**
184     * Flag for {@link #requestedPermissionsFlags}: the requested permission
185     * is currently granted to the application.
186     */
187    public static final int REQUESTED_PERMISSION_GRANTED = 1<<1;
188
189    /**
190     * Array of all signatures read from the package file.  This is only filled
191     * in if the flag {@link PackageManager#GET_SIGNATURES} was set.
192     */
193    public Signature[] signatures;
194
195    /**
196     * Application specified preferred configuration
197     * {@link android.R.styleable#AndroidManifestUsesConfiguration
198     * &lt;uses-configuration&gt;} tags included under &lt;manifest&gt;,
199     * or null if there were none. This is only filled in if the flag
200     * {@link PackageManager#GET_CONFIGURATIONS} was set.
201     */
202    public ConfigurationInfo[] configPreferences;
203
204    /**
205     * Features that this application has requested.
206     *
207     * @see FeatureInfo#FLAG_REQUIRED
208     */
209    public FeatureInfo[] reqFeatures;
210
211    /**
212     * Groups of features that this application has requested.
213     * Each group contains a set of features that are required.
214     * A device must match the features listed in {@link #reqFeatures} and one
215     * or more FeatureGroups in order to have satisfied the feature requirement.
216     *
217     * @see FeatureInfo#FLAG_REQUIRED
218     */
219    public FeatureGroupInfo[] featureGroups;
220
221    /**
222     * Constant corresponding to <code>auto</code> in
223     * the {@link android.R.attr#installLocation} attribute.
224     * @hide
225     */
226    public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
227
228    /**
229     * Constant corresponding to <code>auto</code> in the
230     * {@link android.R.attr#installLocation} attribute.
231     */
232    public static final int INSTALL_LOCATION_AUTO = 0;
233
234    /**
235     * Constant corresponding to <code>internalOnly</code> in the
236     * {@link android.R.attr#installLocation} attribute.
237     */
238    public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
239
240    /**
241     * Constant corresponding to <code>preferExternal</code> in the
242     * {@link android.R.attr#installLocation} attribute.
243     */
244    public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
245
246    /**
247     * The install location requested by the package. From the
248     * {@link android.R.attr#installLocation} attribute, one of
249     * {@link #INSTALL_LOCATION_AUTO}, {@link #INSTALL_LOCATION_INTERNAL_ONLY},
250     * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
251     */
252    public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
253
254    /** @hide */
255    public boolean coreApp;
256
257    /** @hide */
258    public boolean requiredForAllUsers;
259
260    /** @hide */
261    public String restrictedAccountType;
262
263    /** @hide */
264    public String requiredAccountType;
265
266    /**
267     * What package, if any, this package will overlay.
268     *
269     * Package name of target package, or null.
270     * @hide
271     */
272    public String overlayTarget;
273
274    /** @hide */
275    public int overlayPriority;
276
277    /** @hide */
278    public boolean isStaticOverlay;
279
280    public PackageInfo() {
281    }
282
283    @Override
284    public String toString() {
285        return "PackageInfo{"
286            + Integer.toHexString(System.identityHashCode(this))
287            + " " + packageName + "}";
288    }
289
290    @Override
291    public int describeContents() {
292        return 0;
293    }
294
295    @Override
296    public void writeToParcel(Parcel dest, int parcelableFlags) {
297        dest.writeString(packageName);
298        dest.writeStringArray(splitNames);
299        dest.writeInt(versionCode);
300        dest.writeString(versionName);
301        dest.writeInt(baseRevisionCode);
302        dest.writeIntArray(splitRevisionCodes);
303        dest.writeString(sharedUserId);
304        dest.writeInt(sharedUserLabel);
305        if (applicationInfo != null) {
306            dest.writeInt(1);
307            applicationInfo.writeToParcel(dest, parcelableFlags);
308        } else {
309            dest.writeInt(0);
310        }
311        dest.writeLong(firstInstallTime);
312        dest.writeLong(lastUpdateTime);
313        dest.writeIntArray(gids);
314        dest.writeTypedArray(activities, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
315        dest.writeTypedArray(receivers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
316        dest.writeTypedArray(services, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
317        dest.writeTypedArray(providers, parcelableFlags | Parcelable.PARCELABLE_ELIDE_DUPLICATES);
318        dest.writeTypedArray(instrumentation, parcelableFlags);
319        dest.writeTypedArray(permissions, parcelableFlags);
320        dest.writeStringArray(requestedPermissions);
321        dest.writeIntArray(requestedPermissionsFlags);
322        dest.writeTypedArray(signatures, parcelableFlags);
323        dest.writeTypedArray(configPreferences, parcelableFlags);
324        dest.writeTypedArray(reqFeatures, parcelableFlags);
325        dest.writeTypedArray(featureGroups, parcelableFlags);
326        dest.writeInt(installLocation);
327        dest.writeInt(coreApp ? 1 : 0);
328        dest.writeInt(requiredForAllUsers ? 1 : 0);
329        dest.writeString(restrictedAccountType);
330        dest.writeString(requiredAccountType);
331        dest.writeString(overlayTarget);
332        dest.writeInt(isStaticOverlay ? 1 : 0);
333        dest.writeInt(overlayPriority);
334    }
335
336    public static final Parcelable.Creator<PackageInfo> CREATOR
337            = new Parcelable.Creator<PackageInfo>() {
338        @Override
339        public PackageInfo createFromParcel(Parcel source) {
340            return new PackageInfo(source);
341        }
342
343        @Override
344        public PackageInfo[] newArray(int size) {
345            return new PackageInfo[size];
346        }
347    };
348
349    private PackageInfo(Parcel source) {
350        packageName = source.readString();
351        splitNames = source.createStringArray();
352        versionCode = source.readInt();
353        versionName = source.readString();
354        baseRevisionCode = source.readInt();
355        splitRevisionCodes = source.createIntArray();
356        sharedUserId = source.readString();
357        sharedUserLabel = source.readInt();
358        int hasApp = source.readInt();
359        if (hasApp != 0) {
360            applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
361        }
362        firstInstallTime = source.readLong();
363        lastUpdateTime = source.readLong();
364        gids = source.createIntArray();
365        activities = source.createTypedArray(ActivityInfo.CREATOR);
366        receivers = source.createTypedArray(ActivityInfo.CREATOR);
367        services = source.createTypedArray(ServiceInfo.CREATOR);
368        providers = source.createTypedArray(ProviderInfo.CREATOR);
369        instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
370        permissions = source.createTypedArray(PermissionInfo.CREATOR);
371        requestedPermissions = source.createStringArray();
372        requestedPermissionsFlags = source.createIntArray();
373        signatures = source.createTypedArray(Signature.CREATOR);
374        configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
375        reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
376        featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
377        installLocation = source.readInt();
378        coreApp = source.readInt() != 0;
379        requiredForAllUsers = source.readInt() != 0;
380        restrictedAccountType = source.readString();
381        requiredAccountType = source.readString();
382        overlayTarget = source.readString();
383        isStaticOverlay = source.readInt() != 0;
384        overlayPriority = source.readInt();
385
386        // The component lists were flattened with the redundant ApplicationInfo
387        // instances omitted.  Distribute the canonical one here as appropriate.
388        if (applicationInfo != null) {
389            propagateApplicationInfo(applicationInfo, activities);
390            propagateApplicationInfo(applicationInfo, receivers);
391            propagateApplicationInfo(applicationInfo, services);
392            propagateApplicationInfo(applicationInfo, providers);
393        }
394    }
395
396    private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
397        if (components != null) {
398            for (ComponentInfo ci : components) {
399                ci.applicationInfo = appInfo;
400            }
401        }
402    }
403}
404