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.content.pm.PackageManager.NameNotFoundException;
20import android.content.res.Resources;
21import android.graphics.drawable.Drawable;
22import android.os.Parcel;
23import android.os.Parcelable;
24import android.util.Printer;
25
26import java.text.Collator;
27import java.util.Comparator;
28
29/**
30 * Information you can retrieve about a particular application.  This
31 * corresponds to information collected from the AndroidManifest.xml's
32 * <application> tag.
33 */
34public class ApplicationInfo extends PackageItemInfo implements Parcelable {
35
36    /**
37     * Default task affinity of all activities in this application. See
38     * {@link ActivityInfo#taskAffinity} for more information.  This comes
39     * from the "taskAffinity" attribute.
40     */
41    public String taskAffinity;
42
43    /**
44     * Optional name of a permission required to be able to access this
45     * application's components.  From the "permission" attribute.
46     */
47    public String permission;
48
49    /**
50     * The name of the process this application should run in.  From the
51     * "process" attribute or, if not set, the same as
52     * <var>packageName</var>.
53     */
54    public String processName;
55
56    /**
57     * Class implementing the Application object.  From the "class"
58     * attribute.
59     */
60    public String className;
61
62    /**
63     * A style resource identifier (in the package's resources) of the
64     * description of an application.  From the "description" attribute
65     * or, if not set, 0.
66     */
67    public int descriptionRes;
68
69    /**
70     * A style resource identifier (in the package's resources) of the
71     * default visual theme of the application.  From the "theme" attribute
72     * or, if not set, 0.
73     */
74    public int theme;
75
76    /**
77     * Class implementing the Application's manage space
78     * functionality.  From the "manageSpaceActivity"
79     * attribute. This is an optional attribute and will be null if
80     * applications don't specify it in their manifest
81     */
82    public String manageSpaceActivityName;
83
84    /**
85     * Class implementing the Application's backup functionality.  From
86     * the "backupAgent" attribute.  This is an optional attribute and
87     * will be null if the application does not specify it in its manifest.
88     *
89     * <p>If android:allowBackup is set to false, this attribute is ignored.
90     */
91    public String backupAgentName;
92
93    /**
94     * The default extra UI options for activities in this application.
95     * Set from the {@link android.R.attr#uiOptions} attribute in the
96     * activity's manifest.
97     */
98    public int uiOptions = 0;
99
100    /**
101     * Value for {@link #flags}: if set, this application is installed in the
102     * device's system image.
103     */
104    public static final int FLAG_SYSTEM = 1<<0;
105
106    /**
107     * Value for {@link #flags}: set to true if this application would like to
108     * allow debugging of its
109     * code, even when installed on a non-development system.  Comes
110     * from {@link android.R.styleable#AndroidManifestApplication_debuggable
111     * android:debuggable} of the &lt;application&gt; tag.
112     */
113    public static final int FLAG_DEBUGGABLE = 1<<1;
114
115    /**
116     * Value for {@link #flags}: set to true if this application has code
117     * associated with it.  Comes
118     * from {@link android.R.styleable#AndroidManifestApplication_hasCode
119     * android:hasCode} of the &lt;application&gt; tag.
120     */
121    public static final int FLAG_HAS_CODE = 1<<2;
122
123    /**
124     * Value for {@link #flags}: set to true if this application is persistent.
125     * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent
126     * android:persistent} of the &lt;application&gt; tag.
127     */
128    public static final int FLAG_PERSISTENT = 1<<3;
129
130    /**
131     * Value for {@link #flags}: set to true if this application holds the
132     * {@link android.Manifest.permission#FACTORY_TEST} permission and the
133     * device is running in factory test mode.
134     */
135    public static final int FLAG_FACTORY_TEST = 1<<4;
136
137    /**
138     * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
139     * Comes from {@link android.R.styleable#AndroidManifestApplication_allowTaskReparenting
140     * android:allowTaskReparenting} of the &lt;application&gt; tag.
141     */
142    public static final int FLAG_ALLOW_TASK_REPARENTING = 1<<5;
143
144    /**
145     * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
146     * Comes from {@link android.R.styleable#AndroidManifestApplication_allowClearUserData
147     * android:allowClearUserData} of the &lt;application&gt; tag.
148     */
149    public static final int FLAG_ALLOW_CLEAR_USER_DATA = 1<<6;
150
151    /**
152     * Value for {@link #flags}: this is set if this application has been
153     * install as an update to a built-in system application.
154     */
155    public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7;
156
157    /**
158     * Value for {@link #flags}: this is set of the application has specified
159     * {@link android.R.styleable#AndroidManifestApplication_testOnly
160     * android:testOnly} to be true.
161     */
162    public static final int FLAG_TEST_ONLY = 1<<8;
163
164    /**
165     * Value for {@link #flags}: true when the application's window can be
166     * reduced in size for smaller screens.  Corresponds to
167     * {@link android.R.styleable#AndroidManifestSupportsScreens_smallScreens
168     * android:smallScreens}.
169     */
170    public static final int FLAG_SUPPORTS_SMALL_SCREENS = 1<<9;
171
172    /**
173     * Value for {@link #flags}: true when the application's window can be
174     * displayed on normal screens.  Corresponds to
175     * {@link android.R.styleable#AndroidManifestSupportsScreens_normalScreens
176     * android:normalScreens}.
177     */
178    public static final int FLAG_SUPPORTS_NORMAL_SCREENS = 1<<10;
179
180    /**
181     * Value for {@link #flags}: true when the application's window can be
182     * increased in size for larger screens.  Corresponds to
183     * {@link android.R.styleable#AndroidManifestSupportsScreens_largeScreens
184     * android:largeScreens}.
185     */
186    public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<11;
187
188    /**
189     * Value for {@link #flags}: true when the application knows how to adjust
190     * its UI for different screen sizes.  Corresponds to
191     * {@link android.R.styleable#AndroidManifestSupportsScreens_resizeable
192     * android:resizeable}.
193     */
194    public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12;
195
196    /**
197     * Value for {@link #flags}: true when the application knows how to
198     * accomodate different screen densities.  Corresponds to
199     * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity
200     * android:anyDensity}.
201     */
202    public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13;
203
204    /**
205     * Value for {@link #flags}: set to true if this application would like to
206     * request the VM to operate under the safe mode. Comes from
207     * {@link android.R.styleable#AndroidManifestApplication_vmSafeMode
208     * android:vmSafeMode} of the &lt;application&gt; tag.
209     */
210    public static final int FLAG_VM_SAFE_MODE = 1<<14;
211
212    /**
213     * Value for {@link #flags}: set to <code>false</code> if the application does not wish
214     * to permit any OS-driven backups of its data; <code>true</code> otherwise.
215     *
216     * <p>Comes from the
217     * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
218     * attribute of the &lt;application&gt; tag.
219     */
220    public static final int FLAG_ALLOW_BACKUP = 1<<15;
221
222    /**
223     * Value for {@link #flags}: set to <code>false</code> if the application must be kept
224     * in memory following a full-system restore operation; <code>true</code> otherwise.
225     * Ordinarily, during a full system restore operation each application is shut down
226     * following execution of its agent's onRestore() method.  Setting this attribute to
227     * <code>false</code> prevents this.  Most applications will not need to set this attribute.
228     *
229     * <p>If
230     * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
231     * is set to <code>false</code> or no
232     * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
233     * is specified, this flag will be ignored.
234     *
235     * <p>Comes from the
236     * {@link android.R.styleable#AndroidManifestApplication_killAfterRestore android:killAfterRestore}
237     * attribute of the &lt;application&gt; tag.
238     */
239    public static final int FLAG_KILL_AFTER_RESTORE = 1<<16;
240
241    /**
242     * Value for {@link #flags}: Set to <code>true</code> if the application's backup
243     * agent claims to be able to handle restore data even "from the future,"
244     * i.e. from versions of the application with a versionCode greater than
245     * the one currently installed on the device.  <i>Use with caution!</i>  By default
246     * this attribute is <code>false</code> and the Backup Manager will ensure that data
247     * from "future" versions of the application are never supplied during a restore operation.
248     *
249     * <p>If
250     * {@link android.R.styleable#AndroidManifestApplication_allowBackup android:allowBackup}
251     * is set to <code>false</code> or no
252     * {@link android.R.styleable#AndroidManifestApplication_backupAgent android:backupAgent}
253     * is specified, this flag will be ignored.
254     *
255     * <p>Comes from the
256     * {@link android.R.styleable#AndroidManifestApplication_restoreAnyVersion android:restoreAnyVersion}
257     * attribute of the &lt;application&gt; tag.
258     */
259    public static final int FLAG_RESTORE_ANY_VERSION = 1<<17;
260
261    /**
262     * Value for {@link #flags}: Set to true if the application is
263     * currently installed on external/removable/unprotected storage.  Such
264     * applications may not be available if their storage is not currently
265     * mounted.  When the storage it is on is not available, it will look like
266     * the application has been uninstalled (its .apk is no longer available)
267     * but its persistent data is not removed.
268     */
269    public static final int FLAG_EXTERNAL_STORAGE = 1<<18;
270
271    /**
272     * Value for {@link #flags}: true when the application's window can be
273     * increased in size for extra large screens.  Corresponds to
274     * {@link android.R.styleable#AndroidManifestSupportsScreens_xlargeScreens
275     * android:xlargeScreens}.
276     */
277    public static final int FLAG_SUPPORTS_XLARGE_SCREENS = 1<<19;
278
279    /**
280     * Value for {@link #flags}: true when the application has requested a
281     * large heap for its processes.  Corresponds to
282     * {@link android.R.styleable#AndroidManifestApplication_largeHeap
283     * android:largeHeap}.
284     */
285    public static final int FLAG_LARGE_HEAP = 1<<20;
286
287    /**
288     * Value for {@link #flags}: true if this application's package is in
289     * the stopped state.
290     */
291    public static final int FLAG_STOPPED = 1<<21;
292
293    /**
294     * Value for {@link #flags}: true  when the application is willing to support
295     * RTL (right to left). All activities will inherit this value.
296     *
297     * Set from the {@link android.R.attr#supportsRtl} attribute in the
298     * activity's manifest.
299     *
300     * Default value is false (no support for RTL).
301     */
302    public static final int FLAG_SUPPORTS_RTL = 1<<22;
303
304    /**
305     * Value for {@link #flags}: true if the application is currently
306     * installed for the calling user.
307     */
308    public static final int FLAG_INSTALLED = 1<<23;
309
310    /**
311     * Value for {@link #flags}: true if the application only has its
312     * data installed; the application package itself does not currently
313     * exist on the device.
314     */
315    public static final int FLAG_IS_DATA_ONLY = 1<<24;
316
317    /**
318     * Value for {@link #flags}: set to {@code true} if the application
319     * is permitted to hold privileged permissions.
320     *
321     * {@hide}
322     */
323    public static final int FLAG_PRIVILEGED = 1<<30;
324
325    /**
326     * Value for {@link #flags}: Set to true if the application has been
327     * installed using the forward lock option.
328     *
329     * NOTE: DO NOT CHANGE THIS VALUE!  It is saved in packages.xml.
330     *
331     * {@hide}
332     */
333    public static final int FLAG_FORWARD_LOCK = 1<<29;
334
335    /**
336     * Value for {@link #flags}: set to <code>true</code> if the application
337     * has reported that it is heavy-weight, and thus can not participate in
338     * the normal application lifecycle.
339     *
340     * <p>Comes from the
341     * {@link android.R.styleable#AndroidManifestApplication_cantSaveState android:cantSaveState}
342     * attribute of the &lt;application&gt; tag.
343     *
344     * {@hide}
345     */
346    public static final int FLAG_CANT_SAVE_STATE = 1<<28;
347
348    /**
349     * Value for {@link #flags}: true if the application is blocked via restrictions and for
350     * most purposes is considered as not installed.
351     * {@hide}
352     */
353    public static final int FLAG_BLOCKED = 1<<27;
354
355    /**
356     * Flags associated with the application.  Any combination of
357     * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
358     * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
359     * {@link #FLAG_ALLOW_TASK_REPARENTING}
360     * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
361     * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
362     * {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
363     * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_SUPPORTS_XLARGE_SCREENS},
364     * {@link #FLAG_RESIZEABLE_FOR_SCREENS},
365     * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}, {@link #FLAG_VM_SAFE_MODE},
366     * {@link #FLAG_INSTALLED}.
367     */
368    public int flags = 0;
369
370    /**
371     * The required smallest screen width the application can run on.  If 0,
372     * nothing has been specified.  Comes from
373     * {@link android.R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp
374     * android:requiresSmallestWidthDp} attribute of the &lt;supports-screens&gt; tag.
375     */
376    public int requiresSmallestWidthDp = 0;
377
378    /**
379     * The maximum smallest screen width the application is designed for.  If 0,
380     * nothing has been specified.  Comes from
381     * {@link android.R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp
382     * android:compatibleWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
383     */
384    public int compatibleWidthLimitDp = 0;
385
386    /**
387     * The maximum smallest screen width the application will work on.  If 0,
388     * nothing has been specified.  Comes from
389     * {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp
390     * android:largestWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
391     */
392    public int largestWidthLimitDp = 0;
393
394    /**
395     * Full path to the location of this package.
396     */
397    public String sourceDir;
398
399    /**
400     * Full path to the location of the publicly available parts of this
401     * package (i.e. the primary resource package and manifest).  For
402     * non-forward-locked apps this will be the same as {@link #sourceDir).
403     */
404    public String publicSourceDir;
405
406    /**
407     * Full paths to the locations of extra resource packages this application
408     * uses. This field is only used if there are extra resource packages,
409     * otherwise it is null.
410     *
411     * {@hide}
412     */
413    public String[] resourceDirs;
414
415    /**
416     * String retrieved from the seinfo tag found in selinux policy. This value
417     * is useful in setting an SELinux security context on the process as well
418     * as its data directory.
419     *
420     * {@hide}
421     */
422    public String seinfo;
423
424    /**
425     * Paths to all shared libraries this application is linked against.  This
426     * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES
427     * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving
428     * the structure.
429     */
430    public String[] sharedLibraryFiles;
431
432    /**
433     * Full path to a directory assigned to the package for its persistent
434     * data.
435     */
436    public String dataDir;
437
438    /**
439     * Full path to the directory where native JNI libraries are stored.
440     */
441    public String nativeLibraryDir;
442
443    /**
444     * The kernel user-ID that has been assigned to this application;
445     * currently this is not a unique ID (multiple applications can have
446     * the same uid).
447     */
448    public int uid;
449
450    /**
451     * The minimum SDK version this application targets.  It may run on earlier
452     * versions, but it knows how to work with any new behavior added at this
453     * version.  Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
454     * if this is a development build and the app is targeting that.  You should
455     * compare that this number is >= the SDK version number at which your
456     * behavior was introduced.
457     */
458    public int targetSdkVersion;
459
460    /**
461     * When false, indicates that all components within this application are
462     * considered disabled, regardless of their individually set enabled status.
463     */
464    public boolean enabled = true;
465
466    /**
467     * For convenient access to the current enabled setting of this app.
468     * @hide
469     */
470    public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
471
472    /**
473     * For convenient access to package's install location.
474     * @hide
475     */
476    public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
477
478    public void dump(Printer pw, String prefix) {
479        super.dumpFront(pw, prefix);
480        if (className != null) {
481            pw.println(prefix + "className=" + className);
482        }
483        if (permission != null) {
484            pw.println(prefix + "permission=" + permission);
485        }
486        pw.println(prefix + "processName=" + processName);
487        pw.println(prefix + "taskAffinity=" + taskAffinity);
488        pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags)
489                + " theme=0x" + Integer.toHexString(theme));
490        pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp
491                + " compatibleWidthLimitDp=" + compatibleWidthLimitDp
492                + " largestWidthLimitDp=" + largestWidthLimitDp);
493        pw.println(prefix + "sourceDir=" + sourceDir);
494        if (sourceDir == null) {
495            if (publicSourceDir != null) {
496                pw.println(prefix + "publicSourceDir=" + publicSourceDir);
497            }
498        } else if (!sourceDir.equals(publicSourceDir)) {
499            pw.println(prefix + "publicSourceDir=" + publicSourceDir);
500        }
501        if (resourceDirs != null) {
502            pw.println(prefix + "resourceDirs=" + resourceDirs);
503        }
504        if (seinfo != null) {
505            pw.println(prefix + "seinfo=" + seinfo);
506        }
507        pw.println(prefix + "dataDir=" + dataDir);
508        if (sharedLibraryFiles != null) {
509            pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
510        }
511        pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion);
512        if (manageSpaceActivityName != null) {
513            pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
514        }
515        if (descriptionRes != 0) {
516            pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
517        }
518        if (uiOptions != 0) {
519            pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions));
520        }
521        pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false"));
522        super.dumpBack(pw, prefix);
523    }
524
525    /**
526     * @return true if "supportsRtl" has been set to true in the AndroidManifest
527     * @hide
528     */
529    public boolean hasRtlSupport() {
530        return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
531    }
532
533    public static class DisplayNameComparator
534            implements Comparator<ApplicationInfo> {
535        public DisplayNameComparator(PackageManager pm) {
536            mPM = pm;
537        }
538
539        public final int compare(ApplicationInfo aa, ApplicationInfo ab) {
540            CharSequence  sa = mPM.getApplicationLabel(aa);
541            if (sa == null) {
542                sa = aa.packageName;
543            }
544            CharSequence  sb = mPM.getApplicationLabel(ab);
545            if (sb == null) {
546                sb = ab.packageName;
547            }
548
549            return sCollator.compare(sa.toString(), sb.toString());
550        }
551
552        private final Collator   sCollator = Collator.getInstance();
553        private PackageManager   mPM;
554    }
555
556    public ApplicationInfo() {
557    }
558
559    public ApplicationInfo(ApplicationInfo orig) {
560        super(orig);
561        taskAffinity = orig.taskAffinity;
562        permission = orig.permission;
563        processName = orig.processName;
564        className = orig.className;
565        theme = orig.theme;
566        flags = orig.flags;
567        requiresSmallestWidthDp = orig.requiresSmallestWidthDp;
568        compatibleWidthLimitDp = orig.compatibleWidthLimitDp;
569        largestWidthLimitDp = orig.largestWidthLimitDp;
570        sourceDir = orig.sourceDir;
571        publicSourceDir = orig.publicSourceDir;
572        nativeLibraryDir = orig.nativeLibraryDir;
573        resourceDirs = orig.resourceDirs;
574        seinfo = orig.seinfo;
575        sharedLibraryFiles = orig.sharedLibraryFiles;
576        dataDir = orig.dataDir;
577        uid = orig.uid;
578        targetSdkVersion = orig.targetSdkVersion;
579        enabled = orig.enabled;
580        enabledSetting = orig.enabledSetting;
581        installLocation = orig.installLocation;
582        manageSpaceActivityName = orig.manageSpaceActivityName;
583        descriptionRes = orig.descriptionRes;
584        uiOptions = orig.uiOptions;
585        backupAgentName = orig.backupAgentName;
586    }
587
588
589    public String toString() {
590        return "ApplicationInfo{"
591            + Integer.toHexString(System.identityHashCode(this))
592            + " " + packageName + "}";
593    }
594
595    public int describeContents() {
596        return 0;
597    }
598
599    public void writeToParcel(Parcel dest, int parcelableFlags) {
600        super.writeToParcel(dest, parcelableFlags);
601        dest.writeString(taskAffinity);
602        dest.writeString(permission);
603        dest.writeString(processName);
604        dest.writeString(className);
605        dest.writeInt(theme);
606        dest.writeInt(flags);
607        dest.writeInt(requiresSmallestWidthDp);
608        dest.writeInt(compatibleWidthLimitDp);
609        dest.writeInt(largestWidthLimitDp);
610        dest.writeString(sourceDir);
611        dest.writeString(publicSourceDir);
612        dest.writeString(nativeLibraryDir);
613        dest.writeStringArray(resourceDirs);
614        dest.writeString(seinfo);
615        dest.writeStringArray(sharedLibraryFiles);
616        dest.writeString(dataDir);
617        dest.writeInt(uid);
618        dest.writeInt(targetSdkVersion);
619        dest.writeInt(enabled ? 1 : 0);
620        dest.writeInt(enabledSetting);
621        dest.writeInt(installLocation);
622        dest.writeString(manageSpaceActivityName);
623        dest.writeString(backupAgentName);
624        dest.writeInt(descriptionRes);
625        dest.writeInt(uiOptions);
626    }
627
628    public static final Parcelable.Creator<ApplicationInfo> CREATOR
629            = new Parcelable.Creator<ApplicationInfo>() {
630        public ApplicationInfo createFromParcel(Parcel source) {
631            return new ApplicationInfo(source);
632        }
633        public ApplicationInfo[] newArray(int size) {
634            return new ApplicationInfo[size];
635        }
636    };
637
638    private ApplicationInfo(Parcel source) {
639        super(source);
640        taskAffinity = source.readString();
641        permission = source.readString();
642        processName = source.readString();
643        className = source.readString();
644        theme = source.readInt();
645        flags = source.readInt();
646        requiresSmallestWidthDp = source.readInt();
647        compatibleWidthLimitDp = source.readInt();
648        largestWidthLimitDp = source.readInt();
649        sourceDir = source.readString();
650        publicSourceDir = source.readString();
651        nativeLibraryDir = source.readString();
652        resourceDirs = source.readStringArray();
653        seinfo = source.readString();
654        sharedLibraryFiles = source.readStringArray();
655        dataDir = source.readString();
656        uid = source.readInt();
657        targetSdkVersion = source.readInt();
658        enabled = source.readInt() != 0;
659        enabledSetting = source.readInt();
660        installLocation = source.readInt();
661        manageSpaceActivityName = source.readString();
662        backupAgentName = source.readString();
663        descriptionRes = source.readInt();
664        uiOptions = source.readInt();
665    }
666
667    /**
668     * Retrieve the textual description of the application.  This
669     * will call back on the given PackageManager to load the description from
670     * the application.
671     *
672     * @param pm A PackageManager from which the label can be loaded; usually
673     * the PackageManager from which you originally retrieved this item.
674     *
675     * @return Returns a CharSequence containing the application's description.
676     * If there is no description, null is returned.
677     */
678    public CharSequence loadDescription(PackageManager pm) {
679        if (descriptionRes != 0) {
680            CharSequence label = pm.getText(packageName, descriptionRes, this);
681            if (label != null) {
682                return label;
683            }
684        }
685        return null;
686    }
687
688    /**
689     * Disable compatibility mode
690     *
691     * @hide
692     */
693    public void disableCompatibilityMode() {
694        flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
695                FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
696                FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS);
697    }
698
699    /**
700     * @hide
701     */
702    @Override protected Drawable loadDefaultIcon(PackageManager pm) {
703        if ((flags & FLAG_EXTERNAL_STORAGE) != 0
704                && isPackageUnavailable(pm)) {
705            return Resources.getSystem().getDrawable(
706                    com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon);
707        }
708        return pm.getDefaultActivityIcon();
709    }
710
711    private boolean isPackageUnavailable(PackageManager pm) {
712        try {
713            return pm.getPackageInfo(packageName, 0) == null;
714        } catch (NameNotFoundException ex) {
715            return true;
716        }
717    }
718
719    /**
720     * @hide
721     */
722    @Override protected ApplicationInfo getApplicationInfo() {
723        return this;
724    }
725}
726