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 
17 package android.content.pm;
18 
19 import android.os.Parcel;
20 import 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  */
26 public 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 
PackageInfo()274     public PackageInfo() {
275     }
276 
277     @Override
toString()278     public String toString() {
279         return "PackageInfo{"
280             + Integer.toHexString(System.identityHashCode(this))
281             + " " + packageName + "}";
282     }
283 
284     @Override
describeContents()285     public int describeContents() {
286         return 0;
287     }
288 
289     @Override
writeToParcel(Parcel dest, int parcelableFlags)290     public void writeToParcel(Parcel dest, int parcelableFlags) {
291         dest.writeString(packageName);
292         dest.writeStringArray(splitNames);
293         dest.writeInt(versionCode);
294         dest.writeString(versionName);
295         dest.writeInt(baseRevisionCode);
296         dest.writeIntArray(splitRevisionCodes);
297         dest.writeString(sharedUserId);
298         dest.writeInt(sharedUserLabel);
299         if (applicationInfo != null) {
300             dest.writeInt(1);
301             applicationInfo.writeToParcel(dest, parcelableFlags);
302         } else {
303             dest.writeInt(0);
304         }
305         dest.writeLong(firstInstallTime);
306         dest.writeLong(lastUpdateTime);
307         dest.writeIntArray(gids);
308         dest.writeTypedArray(activities, parcelableFlags);
309         dest.writeTypedArray(receivers, parcelableFlags);
310         dest.writeTypedArray(services, parcelableFlags);
311         dest.writeTypedArray(providers, parcelableFlags);
312         dest.writeTypedArray(instrumentation, parcelableFlags);
313         dest.writeTypedArray(permissions, parcelableFlags);
314         dest.writeStringArray(requestedPermissions);
315         dest.writeIntArray(requestedPermissionsFlags);
316         dest.writeTypedArray(signatures, parcelableFlags);
317         dest.writeTypedArray(configPreferences, parcelableFlags);
318         dest.writeTypedArray(reqFeatures, parcelableFlags);
319         dest.writeTypedArray(featureGroups, parcelableFlags);
320         dest.writeInt(installLocation);
321         dest.writeInt(coreApp ? 1 : 0);
322         dest.writeInt(requiredForAllUsers ? 1 : 0);
323         dest.writeString(restrictedAccountType);
324         dest.writeString(requiredAccountType);
325         dest.writeString(overlayTarget);
326     }
327 
328     public static final Parcelable.Creator<PackageInfo> CREATOR
329             = new Parcelable.Creator<PackageInfo>() {
330         @Override
331         public PackageInfo createFromParcel(Parcel source) {
332             return new PackageInfo(source);
333         }
334 
335         @Override
336         public PackageInfo[] newArray(int size) {
337             return new PackageInfo[size];
338         }
339     };
340 
PackageInfo(Parcel source)341     private PackageInfo(Parcel source) {
342         packageName = source.readString();
343         splitNames = source.createStringArray();
344         versionCode = source.readInt();
345         versionName = source.readString();
346         baseRevisionCode = source.readInt();
347         splitRevisionCodes = source.createIntArray();
348         sharedUserId = source.readString();
349         sharedUserLabel = source.readInt();
350         int hasApp = source.readInt();
351         if (hasApp != 0) {
352             applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
353         }
354         firstInstallTime = source.readLong();
355         lastUpdateTime = source.readLong();
356         gids = source.createIntArray();
357         activities = source.createTypedArray(ActivityInfo.CREATOR);
358         receivers = source.createTypedArray(ActivityInfo.CREATOR);
359         services = source.createTypedArray(ServiceInfo.CREATOR);
360         providers = source.createTypedArray(ProviderInfo.CREATOR);
361         instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
362         permissions = source.createTypedArray(PermissionInfo.CREATOR);
363         requestedPermissions = source.createStringArray();
364         requestedPermissionsFlags = source.createIntArray();
365         signatures = source.createTypedArray(Signature.CREATOR);
366         configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
367         reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
368         featureGroups = source.createTypedArray(FeatureGroupInfo.CREATOR);
369         installLocation = source.readInt();
370         coreApp = source.readInt() != 0;
371         requiredForAllUsers = source.readInt() != 0;
372         restrictedAccountType = source.readString();
373         requiredAccountType = source.readString();
374         overlayTarget = source.readString();
375     }
376 }
377