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 version number of this package, as specified by the <manifest>
35     * tag's {@link android.R.styleable#AndroidManifest_versionCode versionCode}
36     * attribute.
37     */
38    public int versionCode;
39
40    /**
41     * The version name of this package, as specified by the <manifest>
42     * tag's {@link android.R.styleable#AndroidManifest_versionName versionName}
43     * attribute.
44     */
45    public String versionName;
46
47    /**
48     * The shared user ID name of this package, as specified by the <manifest>
49     * tag's {@link android.R.styleable#AndroidManifest_sharedUserId sharedUserId}
50     * attribute.
51     */
52    public String sharedUserId;
53
54    /**
55     * The shared user ID label of this package, as specified by the <manifest>
56     * tag's {@link android.R.styleable#AndroidManifest_sharedUserLabel sharedUserLabel}
57     * attribute.
58     */
59    public int sharedUserLabel;
60
61    /**
62     * Information collected from the <application> tag, or null if
63     * there was none.
64     */
65    public ApplicationInfo applicationInfo;
66
67    /**
68     * The time at which the app was first installed.  Units are as
69     * per {@link System#currentTimeMillis()}.
70     */
71    public long firstInstallTime;
72
73    /**
74     * The time at which the app was last updated.  Units are as
75     * per {@link System#currentTimeMillis()}.
76     */
77    public long lastUpdateTime;
78
79    /**
80     * All kernel group-IDs that have been assigned to this package.
81     * This is only filled in if the flag {@link PackageManager#GET_GIDS} was set.
82     */
83    public int[] gids;
84
85    /**
86     * Array of all {@link android.R.styleable#AndroidManifestActivity
87     * <activity>} tags included under <application>,
88     * or null if there were none.  This is only filled in if the flag
89     * {@link PackageManager#GET_ACTIVITIES} was set.
90     */
91    public ActivityInfo[] activities;
92
93    /**
94     * Array of all {@link android.R.styleable#AndroidManifestReceiver
95     * <receiver>} tags included under <application>,
96     * or null if there were none.  This is only filled in if the flag
97     * {@link PackageManager#GET_RECEIVERS} was set.
98     */
99    public ActivityInfo[] receivers;
100
101    /**
102     * Array of all {@link android.R.styleable#AndroidManifestService
103     * <service>} tags included under <application>,
104     * or null if there were none.  This is only filled in if the flag
105     * {@link PackageManager#GET_SERVICES} was set.
106     */
107    public ServiceInfo[] services;
108
109    /**
110     * Array of all {@link android.R.styleable#AndroidManifestProvider
111     * <provider>} tags included under <application>,
112     * or null if there were none.  This is only filled in if the flag
113     * {@link PackageManager#GET_PROVIDERS} was set.
114     */
115    public ProviderInfo[] providers;
116
117    /**
118     * Array of all {@link android.R.styleable#AndroidManifestInstrumentation
119     * <instrumentation>} tags included under <manifest>,
120     * or null if there were none.  This is only filled in if the flag
121     * {@link PackageManager#GET_INSTRUMENTATION} was set.
122     */
123    public InstrumentationInfo[] instrumentation;
124
125    /**
126     * Array of all {@link android.R.styleable#AndroidManifestPermission
127     * <permission>} tags included under <manifest>,
128     * or null if there were none.  This is only filled in if the flag
129     * {@link PackageManager#GET_PERMISSIONS} was set.
130     */
131    public PermissionInfo[] permissions;
132
133    /**
134     * Array of all {@link android.R.styleable#AndroidManifestUsesPermission
135     * <uses-permission>} tags included under <manifest>,
136     * or null if there were none.  This is only filled in if the flag
137     * {@link PackageManager#GET_PERMISSIONS} was set.  This list includes
138     * all permissions requested, even those that were not granted or known
139     * by the system at install time.
140     */
141    public String[] requestedPermissions;
142
143    /**
144     * Array of flags of all {@link android.R.styleable#AndroidManifestUsesPermission
145     * <uses-permission>} tags included under <manifest>,
146     * or null if there were none.  This is only filled in if the flag
147     * {@link PackageManager#GET_PERMISSIONS} was set.  Each value matches
148     * the corresponding entry in {@link #requestedPermissions}, and will have
149     * the flags {@link #REQUESTED_PERMISSION_REQUIRED} and
150     * {@link #REQUESTED_PERMISSION_GRANTED} set as appropriate.
151     */
152    public int[] requestedPermissionsFlags;
153
154    /**
155     * Flag for {@link #requestedPermissionsFlags}: the requested permission
156     * is required for the application to run; the user can not optionally
157     * disable it.  Currently all permissions are required.
158     */
159    public static final int REQUESTED_PERMISSION_REQUIRED = 1<<0;
160
161    /**
162     * Flag for {@link #requestedPermissionsFlags}: the requested permission
163     * is currently granted to the application.
164     */
165    public static final int REQUESTED_PERMISSION_GRANTED = 1<<1;
166
167    /**
168     * Array of all signatures read from the package file.  This is only filled
169     * in if the flag {@link PackageManager#GET_SIGNATURES} was set.
170     */
171    public Signature[] signatures;
172
173    /**
174     * Application specified preferred configuration
175     * {@link android.R.styleable#AndroidManifestUsesConfiguration
176     * &lt;uses-configuration&gt;} tags included under &lt;manifest&gt;,
177     * or null if there were none. This is only filled in if the flag
178     * {@link PackageManager#GET_CONFIGURATIONS} was set.
179     */
180    public ConfigurationInfo[] configPreferences;
181
182    /**
183     * The features that this application has said it requires.
184     */
185    public FeatureInfo[] reqFeatures;
186
187    /**
188     * Constant corresponding to <code>auto</code> in
189     * the {@link android.R.attr#installLocation} attribute.
190     * @hide
191     */
192    public static final int INSTALL_LOCATION_UNSPECIFIED = -1;
193    /**
194     * Constant corresponding to <code>auto</code> in
195     * the {@link android.R.attr#installLocation} attribute.
196     * @hide
197     */
198    public static final int INSTALL_LOCATION_AUTO = 0;
199    /**
200     * Constant corresponding to <code>internalOnly</code> in
201     * the {@link android.R.attr#installLocation} attribute.
202     * @hide
203     */
204    public static final int INSTALL_LOCATION_INTERNAL_ONLY = 1;
205    /**
206     * Constant corresponding to <code>preferExternal</code> in
207     * the {@link android.R.attr#installLocation} attribute.
208     * @hide
209     */
210    public static final int INSTALL_LOCATION_PREFER_EXTERNAL = 2;
211    /**
212     * The install location requested by the activity.  From the
213     * {@link android.R.attr#installLocation} attribute, one of
214     * {@link #INSTALL_LOCATION_AUTO},
215     * {@link #INSTALL_LOCATION_INTERNAL_ONLY},
216     * {@link #INSTALL_LOCATION_PREFER_EXTERNAL}
217     * @hide
218     */
219    public int installLocation = INSTALL_LOCATION_INTERNAL_ONLY;
220
221    public PackageInfo() {
222    }
223
224    public String toString() {
225        return "PackageInfo{"
226            + Integer.toHexString(System.identityHashCode(this))
227            + " " + packageName + "}";
228    }
229
230    public int describeContents() {
231        return 0;
232    }
233
234    public void writeToParcel(Parcel dest, int parcelableFlags) {
235        dest.writeString(packageName);
236        dest.writeInt(versionCode);
237        dest.writeString(versionName);
238        dest.writeString(sharedUserId);
239        dest.writeInt(sharedUserLabel);
240        if (applicationInfo != null) {
241            dest.writeInt(1);
242            applicationInfo.writeToParcel(dest, parcelableFlags);
243        } else {
244            dest.writeInt(0);
245        }
246        dest.writeLong(firstInstallTime);
247        dest.writeLong(lastUpdateTime);
248        dest.writeIntArray(gids);
249        dest.writeTypedArray(activities, parcelableFlags);
250        dest.writeTypedArray(receivers, parcelableFlags);
251        dest.writeTypedArray(services, parcelableFlags);
252        dest.writeTypedArray(providers, parcelableFlags);
253        dest.writeTypedArray(instrumentation, parcelableFlags);
254        dest.writeTypedArray(permissions, parcelableFlags);
255        dest.writeStringArray(requestedPermissions);
256        dest.writeIntArray(requestedPermissionsFlags);
257        dest.writeTypedArray(signatures, parcelableFlags);
258        dest.writeTypedArray(configPreferences, parcelableFlags);
259        dest.writeTypedArray(reqFeatures, parcelableFlags);
260        dest.writeInt(installLocation);
261    }
262
263    public static final Parcelable.Creator<PackageInfo> CREATOR
264            = new Parcelable.Creator<PackageInfo>() {
265        public PackageInfo createFromParcel(Parcel source) {
266            return new PackageInfo(source);
267        }
268
269        public PackageInfo[] newArray(int size) {
270            return new PackageInfo[size];
271        }
272    };
273
274    private PackageInfo(Parcel source) {
275        packageName = source.readString();
276        versionCode = source.readInt();
277        versionName = source.readString();
278        sharedUserId = source.readString();
279        sharedUserLabel = source.readInt();
280        int hasApp = source.readInt();
281        if (hasApp != 0) {
282            applicationInfo = ApplicationInfo.CREATOR.createFromParcel(source);
283        }
284        firstInstallTime = source.readLong();
285        lastUpdateTime = source.readLong();
286        gids = source.createIntArray();
287        activities = source.createTypedArray(ActivityInfo.CREATOR);
288        receivers = source.createTypedArray(ActivityInfo.CREATOR);
289        services = source.createTypedArray(ServiceInfo.CREATOR);
290        providers = source.createTypedArray(ProviderInfo.CREATOR);
291        instrumentation = source.createTypedArray(InstrumentationInfo.CREATOR);
292        permissions = source.createTypedArray(PermissionInfo.CREATOR);
293        requestedPermissions = source.createStringArray();
294        requestedPermissionsFlags = source.createIntArray();
295        signatures = source.createTypedArray(Signature.CREATOR);
296        configPreferences = source.createTypedArray(ConfigurationInfo.CREATOR);
297        reqFeatures = source.createTypedArray(FeatureInfo.CREATOR);
298        installLocation = source.readInt();
299    }
300}
301