ApplicationInfo.java revision ff0c470833b2cb4130a30895093630242d5f238d
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 ABI that this application requires, This is inferred from the ABIs
445     * of the native JNI libraries the application bundles. Will be {@code null}
446     * if this application does not require any particular ABI.
447     *
448     * {@hide}
449     */
450    public String requiredCpuAbi;
451
452    /**
453     * The kernel user-ID that has been assigned to this application;
454     * currently this is not a unique ID (multiple applications can have
455     * the same uid).
456     */
457    public int uid;
458
459    /**
460     * The minimum SDK version this application targets.  It may run on earlier
461     * versions, but it knows how to work with any new behavior added at this
462     * version.  Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
463     * if this is a development build and the app is targeting that.  You should
464     * compare that this number is >= the SDK version number at which your
465     * behavior was introduced.
466     */
467    public int targetSdkVersion;
468
469    /**
470     * When false, indicates that all components within this application are
471     * considered disabled, regardless of their individually set enabled status.
472     */
473    public boolean enabled = true;
474
475    /**
476     * For convenient access to the current enabled setting of this app.
477     * @hide
478     */
479    public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
480
481    /**
482     * For convenient access to package's install location.
483     * @hide
484     */
485    public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
486
487    public void dump(Printer pw, String prefix) {
488        super.dumpFront(pw, prefix);
489        if (className != null) {
490            pw.println(prefix + "className=" + className);
491        }
492        if (permission != null) {
493            pw.println(prefix + "permission=" + permission);
494        }
495        pw.println(prefix + "processName=" + processName);
496        pw.println(prefix + "taskAffinity=" + taskAffinity);
497        pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags)
498                + " theme=0x" + Integer.toHexString(theme));
499        pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp
500                + " compatibleWidthLimitDp=" + compatibleWidthLimitDp
501                + " largestWidthLimitDp=" + largestWidthLimitDp);
502        pw.println(prefix + "sourceDir=" + sourceDir);
503        if (sourceDir == null) {
504            if (publicSourceDir != null) {
505                pw.println(prefix + "publicSourceDir=" + publicSourceDir);
506            }
507        } else if (!sourceDir.equals(publicSourceDir)) {
508            pw.println(prefix + "publicSourceDir=" + publicSourceDir);
509        }
510        if (resourceDirs != null) {
511            pw.println(prefix + "resourceDirs=" + resourceDirs);
512        }
513        if (seinfo != null) {
514            pw.println(prefix + "seinfo=" + seinfo);
515        }
516        pw.println(prefix + "dataDir=" + dataDir);
517        if (sharedLibraryFiles != null) {
518            pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
519        }
520        pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion);
521        if (manageSpaceActivityName != null) {
522            pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
523        }
524        if (descriptionRes != 0) {
525            pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
526        }
527        if (uiOptions != 0) {
528            pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions));
529        }
530        pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false"));
531        super.dumpBack(pw, prefix);
532    }
533
534    /**
535     * @return true if "supportsRtl" has been set to true in the AndroidManifest
536     * @hide
537     */
538    public boolean hasRtlSupport() {
539        return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
540    }
541
542    public static class DisplayNameComparator
543            implements Comparator<ApplicationInfo> {
544        public DisplayNameComparator(PackageManager pm) {
545            mPM = pm;
546        }
547
548        public final int compare(ApplicationInfo aa, ApplicationInfo ab) {
549            CharSequence  sa = mPM.getApplicationLabel(aa);
550            if (sa == null) {
551                sa = aa.packageName;
552            }
553            CharSequence  sb = mPM.getApplicationLabel(ab);
554            if (sb == null) {
555                sb = ab.packageName;
556            }
557
558            return sCollator.compare(sa.toString(), sb.toString());
559        }
560
561        private final Collator   sCollator = Collator.getInstance();
562        private PackageManager   mPM;
563    }
564
565    public ApplicationInfo() {
566    }
567
568    public ApplicationInfo(ApplicationInfo orig) {
569        super(orig);
570        taskAffinity = orig.taskAffinity;
571        permission = orig.permission;
572        processName = orig.processName;
573        className = orig.className;
574        theme = orig.theme;
575        flags = orig.flags;
576        requiresSmallestWidthDp = orig.requiresSmallestWidthDp;
577        compatibleWidthLimitDp = orig.compatibleWidthLimitDp;
578        largestWidthLimitDp = orig.largestWidthLimitDp;
579        sourceDir = orig.sourceDir;
580        publicSourceDir = orig.publicSourceDir;
581        nativeLibraryDir = orig.nativeLibraryDir;
582        requiredCpuAbi = orig.requiredCpuAbi;
583        resourceDirs = orig.resourceDirs;
584        seinfo = orig.seinfo;
585        sharedLibraryFiles = orig.sharedLibraryFiles;
586        dataDir = orig.dataDir;
587        uid = orig.uid;
588        targetSdkVersion = orig.targetSdkVersion;
589        enabled = orig.enabled;
590        enabledSetting = orig.enabledSetting;
591        installLocation = orig.installLocation;
592        manageSpaceActivityName = orig.manageSpaceActivityName;
593        descriptionRes = orig.descriptionRes;
594        uiOptions = orig.uiOptions;
595        backupAgentName = orig.backupAgentName;
596    }
597
598
599    public String toString() {
600        return "ApplicationInfo{"
601            + Integer.toHexString(System.identityHashCode(this))
602            + " " + packageName + "}";
603    }
604
605    public int describeContents() {
606        return 0;
607    }
608
609    public void writeToParcel(Parcel dest, int parcelableFlags) {
610        super.writeToParcel(dest, parcelableFlags);
611        dest.writeString(taskAffinity);
612        dest.writeString(permission);
613        dest.writeString(processName);
614        dest.writeString(className);
615        dest.writeInt(theme);
616        dest.writeInt(flags);
617        dest.writeInt(requiresSmallestWidthDp);
618        dest.writeInt(compatibleWidthLimitDp);
619        dest.writeInt(largestWidthLimitDp);
620        dest.writeString(sourceDir);
621        dest.writeString(publicSourceDir);
622        dest.writeString(nativeLibraryDir);
623        dest.writeString(requiredCpuAbi);
624        dest.writeStringArray(resourceDirs);
625        dest.writeString(seinfo);
626        dest.writeStringArray(sharedLibraryFiles);
627        dest.writeString(dataDir);
628        dest.writeInt(uid);
629        dest.writeInt(targetSdkVersion);
630        dest.writeInt(enabled ? 1 : 0);
631        dest.writeInt(enabledSetting);
632        dest.writeInt(installLocation);
633        dest.writeString(manageSpaceActivityName);
634        dest.writeString(backupAgentName);
635        dest.writeInt(descriptionRes);
636        dest.writeInt(uiOptions);
637    }
638
639    public static final Parcelable.Creator<ApplicationInfo> CREATOR
640            = new Parcelable.Creator<ApplicationInfo>() {
641        public ApplicationInfo createFromParcel(Parcel source) {
642            return new ApplicationInfo(source);
643        }
644        public ApplicationInfo[] newArray(int size) {
645            return new ApplicationInfo[size];
646        }
647    };
648
649    private ApplicationInfo(Parcel source) {
650        super(source);
651        taskAffinity = source.readString();
652        permission = source.readString();
653        processName = source.readString();
654        className = source.readString();
655        theme = source.readInt();
656        flags = source.readInt();
657        requiresSmallestWidthDp = source.readInt();
658        compatibleWidthLimitDp = source.readInt();
659        largestWidthLimitDp = source.readInt();
660        sourceDir = source.readString();
661        publicSourceDir = source.readString();
662        nativeLibraryDir = source.readString();
663        requiredCpuAbi = source.readString();
664        resourceDirs = source.readStringArray();
665        seinfo = source.readString();
666        sharedLibraryFiles = source.readStringArray();
667        dataDir = source.readString();
668        uid = source.readInt();
669        targetSdkVersion = source.readInt();
670        enabled = source.readInt() != 0;
671        enabledSetting = source.readInt();
672        installLocation = source.readInt();
673        manageSpaceActivityName = source.readString();
674        backupAgentName = source.readString();
675        descriptionRes = source.readInt();
676        uiOptions = source.readInt();
677    }
678
679    /**
680     * Retrieve the textual description of the application.  This
681     * will call back on the given PackageManager to load the description from
682     * the application.
683     *
684     * @param pm A PackageManager from which the label can be loaded; usually
685     * the PackageManager from which you originally retrieved this item.
686     *
687     * @return Returns a CharSequence containing the application's description.
688     * If there is no description, null is returned.
689     */
690    public CharSequence loadDescription(PackageManager pm) {
691        if (descriptionRes != 0) {
692            CharSequence label = pm.getText(packageName, descriptionRes, this);
693            if (label != null) {
694                return label;
695            }
696        }
697        return null;
698    }
699
700    /**
701     * Disable compatibility mode
702     *
703     * @hide
704     */
705    public void disableCompatibilityMode() {
706        flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
707                FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
708                FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS);
709    }
710
711    /**
712     * @hide
713     */
714    @Override protected Drawable loadDefaultIcon(PackageManager pm) {
715        if ((flags & FLAG_EXTERNAL_STORAGE) != 0
716                && isPackageUnavailable(pm)) {
717            return Resources.getSystem().getDrawable(
718                    com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon);
719        }
720        return pm.getDefaultActivityIcon();
721    }
722
723    private boolean isPackageUnavailable(PackageManager pm) {
724        try {
725            return pm.getPackageInfo(packageName, 0) == null;
726        } catch (NameNotFoundException ex) {
727            return true;
728        }
729    }
730
731    /**
732     * @hide
733     */
734    @Override protected ApplicationInfo getApplicationInfo() {
735        return this;
736    }
737}
738