ApplicationInfo.java revision 0f40dc923c67e8822f9157aec4f786f73848af07
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 true if the application has been
319     * installed using the forward lock option.
320     *
321     * NOTE: DO NOT CHANGE THIS VALUE!  It is saved in packages.xml.
322     *
323     * {@hide}
324     */
325    public static final int FLAG_FORWARD_LOCK = 1<<29;
326
327    /**
328     * Value for {@link #flags}: set to <code>true</code> if the application
329     * has reported that it is heavy-weight, and thus can not participate in
330     * the normal application lifecycle.
331     *
332     * <p>Comes from the
333     * {@link android.R.styleable#AndroidManifestApplication_cantSaveState android:cantSaveState}
334     * attribute of the &lt;application&gt; tag.
335     *
336     * {@hide}
337     */
338    public static final int FLAG_CANT_SAVE_STATE = 1<<28;
339
340    /**
341     * Flags associated with the application.  Any combination of
342     * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
343     * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
344     * {@link #FLAG_ALLOW_TASK_REPARENTING}
345     * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
346     * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
347     * {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
348     * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_SUPPORTS_XLARGE_SCREENS},
349     * {@link #FLAG_RESIZEABLE_FOR_SCREENS},
350     * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}, {@link #FLAG_VM_SAFE_MODE},
351     * {@link #FLAG_INSTALLED}.
352     */
353    public int flags = 0;
354
355    /**
356     * The required smallest screen width the application can run on.  If 0,
357     * nothing has been specified.  Comes from
358     * {@link android.R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp
359     * android:requiresSmallestWidthDp} attribute of the &lt;supports-screens&gt; tag.
360     */
361    public int requiresSmallestWidthDp = 0;
362
363    /**
364     * The maximum smallest screen width the application is designed for.  If 0,
365     * nothing has been specified.  Comes from
366     * {@link android.R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp
367     * android:compatibleWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
368     */
369    public int compatibleWidthLimitDp = 0;
370
371    /**
372     * The maximum smallest screen width the application will work on.  If 0,
373     * nothing has been specified.  Comes from
374     * {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp
375     * android:largestWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
376     */
377    public int largestWidthLimitDp = 0;
378
379    /**
380     * Full path to the location of this package.
381     */
382    public String sourceDir;
383
384    /**
385     * Full path to the location of the publicly available parts of this
386     * package (i.e. the primary resource package and manifest).  For
387     * non-forward-locked apps this will be the same as {@link #sourceDir).
388     */
389    public String publicSourceDir;
390
391    /**
392     * Full paths to the locations of extra resource packages this application
393     * uses. This field is only used if there are extra resource packages,
394     * otherwise it is null.
395     *
396     * {@hide}
397     */
398    public String[] resourceDirs;
399
400    /**
401     * String retrieved from the seinfo tag found in selinux policy. This value
402     * is useful in setting an SELinux security context on the process as well
403     * as its data directory.
404     *
405     * {@hide}
406     */
407    public String seinfo;
408
409    /**
410     * Paths to all shared libraries this application is linked against.  This
411     * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES
412     * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving
413     * the structure.
414     */
415    public String[] sharedLibraryFiles;
416
417    /**
418     * Full path to a directory assigned to the package for its persistent
419     * data.
420     */
421    public String dataDir;
422
423    /**
424     * Full path to the directory where native JNI libraries are stored.
425     */
426    public String nativeLibraryDir;
427
428    /**
429     * The kernel user-ID that has been assigned to this application;
430     * currently this is not a unique ID (multiple applications can have
431     * the same uid).
432     */
433    public int uid;
434
435    /**
436     * The minimum SDK version this application targets.  It may run on earlier
437     * versions, but it knows how to work with any new behavior added at this
438     * version.  Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
439     * if this is a development build and the app is targeting that.  You should
440     * compare that this number is >= the SDK version number at which your
441     * behavior was introduced.
442     */
443    public int targetSdkVersion;
444
445    /**
446     * When false, indicates that all components within this application are
447     * considered disabled, regardless of their individually set enabled status.
448     */
449    public boolean enabled = true;
450
451    /**
452     * For convenient access to the current enabled setting of this app.
453     * @hide
454     */
455    public int enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
456
457    /**
458     * For convenient access to package's install location.
459     * @hide
460     */
461    public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
462
463    public void dump(Printer pw, String prefix) {
464        super.dumpFront(pw, prefix);
465        if (className != null) {
466            pw.println(prefix + "className=" + className);
467        }
468        if (permission != null) {
469            pw.println(prefix + "permission=" + permission);
470        }
471        pw.println(prefix + "processName=" + processName);
472        pw.println(prefix + "taskAffinity=" + taskAffinity);
473        pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags)
474                + " theme=0x" + Integer.toHexString(theme));
475        pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp
476                + " compatibleWidthLimitDp=" + compatibleWidthLimitDp
477                + " largestWidthLimitDp=" + largestWidthLimitDp);
478        pw.println(prefix + "sourceDir=" + sourceDir);
479        if (sourceDir == null) {
480            if (publicSourceDir != null) {
481                pw.println(prefix + "publicSourceDir=" + publicSourceDir);
482            }
483        } else if (!sourceDir.equals(publicSourceDir)) {
484            pw.println(prefix + "publicSourceDir=" + publicSourceDir);
485        }
486        if (resourceDirs != null) {
487            pw.println(prefix + "resourceDirs=" + resourceDirs);
488        }
489        if (seinfo != null) {
490            pw.println(prefix + "seinfo=" + seinfo);
491        }
492        pw.println(prefix + "dataDir=" + dataDir);
493        if (sharedLibraryFiles != null) {
494            pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
495        }
496        pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion);
497        if (manageSpaceActivityName != null) {
498            pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
499        }
500        if (descriptionRes != 0) {
501            pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
502        }
503        if (uiOptions != 0) {
504            pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions));
505        }
506        pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false"));
507        super.dumpBack(pw, prefix);
508    }
509
510    /**
511     * @return true if "supportsRtl" has been set to true in the AndroidManifest
512     * @hide
513     */
514    public boolean hasRtlSupport() {
515        return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
516    }
517
518    public static class DisplayNameComparator
519            implements Comparator<ApplicationInfo> {
520        public DisplayNameComparator(PackageManager pm) {
521            mPM = pm;
522        }
523
524        public final int compare(ApplicationInfo aa, ApplicationInfo ab) {
525            CharSequence  sa = mPM.getApplicationLabel(aa);
526            if (sa == null) {
527                sa = aa.packageName;
528            }
529            CharSequence  sb = mPM.getApplicationLabel(ab);
530            if (sb == null) {
531                sb = ab.packageName;
532            }
533
534            return sCollator.compare(sa.toString(), sb.toString());
535        }
536
537        private final Collator   sCollator = Collator.getInstance();
538        private PackageManager   mPM;
539    }
540
541    public ApplicationInfo() {
542    }
543
544    public ApplicationInfo(ApplicationInfo orig) {
545        super(orig);
546        taskAffinity = orig.taskAffinity;
547        permission = orig.permission;
548        processName = orig.processName;
549        className = orig.className;
550        theme = orig.theme;
551        flags = orig.flags;
552        requiresSmallestWidthDp = orig.requiresSmallestWidthDp;
553        compatibleWidthLimitDp = orig.compatibleWidthLimitDp;
554        largestWidthLimitDp = orig.largestWidthLimitDp;
555        sourceDir = orig.sourceDir;
556        publicSourceDir = orig.publicSourceDir;
557        nativeLibraryDir = orig.nativeLibraryDir;
558        resourceDirs = orig.resourceDirs;
559        seinfo = orig.seinfo;
560        sharedLibraryFiles = orig.sharedLibraryFiles;
561        dataDir = orig.dataDir;
562        uid = orig.uid;
563        targetSdkVersion = orig.targetSdkVersion;
564        enabled = orig.enabled;
565        enabledSetting = orig.enabledSetting;
566        installLocation = orig.installLocation;
567        manageSpaceActivityName = orig.manageSpaceActivityName;
568        descriptionRes = orig.descriptionRes;
569        uiOptions = orig.uiOptions;
570        backupAgentName = orig.backupAgentName;
571    }
572
573
574    public String toString() {
575        return "ApplicationInfo{"
576            + Integer.toHexString(System.identityHashCode(this))
577            + " " + packageName + "}";
578    }
579
580    public int describeContents() {
581        return 0;
582    }
583
584    public void writeToParcel(Parcel dest, int parcelableFlags) {
585        super.writeToParcel(dest, parcelableFlags);
586        dest.writeString(taskAffinity);
587        dest.writeString(permission);
588        dest.writeString(processName);
589        dest.writeString(className);
590        dest.writeInt(theme);
591        dest.writeInt(flags);
592        dest.writeInt(requiresSmallestWidthDp);
593        dest.writeInt(compatibleWidthLimitDp);
594        dest.writeInt(largestWidthLimitDp);
595        dest.writeString(sourceDir);
596        dest.writeString(publicSourceDir);
597        dest.writeString(nativeLibraryDir);
598        dest.writeStringArray(resourceDirs);
599        dest.writeString(seinfo);
600        dest.writeStringArray(sharedLibraryFiles);
601        dest.writeString(dataDir);
602        dest.writeInt(uid);
603        dest.writeInt(targetSdkVersion);
604        dest.writeInt(enabled ? 1 : 0);
605        dest.writeInt(enabledSetting);
606        dest.writeInt(installLocation);
607        dest.writeString(manageSpaceActivityName);
608        dest.writeString(backupAgentName);
609        dest.writeInt(descriptionRes);
610        dest.writeInt(uiOptions);
611    }
612
613    public static final Parcelable.Creator<ApplicationInfo> CREATOR
614            = new Parcelable.Creator<ApplicationInfo>() {
615        public ApplicationInfo createFromParcel(Parcel source) {
616            return new ApplicationInfo(source);
617        }
618        public ApplicationInfo[] newArray(int size) {
619            return new ApplicationInfo[size];
620        }
621    };
622
623    private ApplicationInfo(Parcel source) {
624        super(source);
625        taskAffinity = source.readString();
626        permission = source.readString();
627        processName = source.readString();
628        className = source.readString();
629        theme = source.readInt();
630        flags = source.readInt();
631        requiresSmallestWidthDp = source.readInt();
632        compatibleWidthLimitDp = source.readInt();
633        largestWidthLimitDp = source.readInt();
634        sourceDir = source.readString();
635        publicSourceDir = source.readString();
636        nativeLibraryDir = source.readString();
637        resourceDirs = source.readStringArray();
638        seinfo = source.readString();
639        sharedLibraryFiles = source.readStringArray();
640        dataDir = source.readString();
641        uid = source.readInt();
642        targetSdkVersion = source.readInt();
643        enabled = source.readInt() != 0;
644        enabledSetting = source.readInt();
645        installLocation = source.readInt();
646        manageSpaceActivityName = source.readString();
647        backupAgentName = source.readString();
648        descriptionRes = source.readInt();
649        uiOptions = source.readInt();
650    }
651
652    /**
653     * Retrieve the textual description of the application.  This
654     * will call back on the given PackageManager to load the description from
655     * the application.
656     *
657     * @param pm A PackageManager from which the label can be loaded; usually
658     * the PackageManager from which you originally retrieved this item.
659     *
660     * @return Returns a CharSequence containing the application's description.
661     * If there is no description, null is returned.
662     */
663    public CharSequence loadDescription(PackageManager pm) {
664        if (descriptionRes != 0) {
665            CharSequence label = pm.getText(packageName, descriptionRes, this);
666            if (label != null) {
667                return label;
668            }
669        }
670        return null;
671    }
672
673    /**
674     * Disable compatibility mode
675     *
676     * @hide
677     */
678    public void disableCompatibilityMode() {
679        flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
680                FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
681                FLAG_SUPPORTS_SCREEN_DENSITIES | FLAG_SUPPORTS_XLARGE_SCREENS);
682    }
683
684    /**
685     * @hide
686     */
687    @Override protected Drawable loadDefaultIcon(PackageManager pm) {
688        if ((flags & FLAG_EXTERNAL_STORAGE) != 0
689                && isPackageUnavailable(pm)) {
690            return Resources.getSystem().getDrawable(
691                    com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon);
692        }
693        return pm.getDefaultActivityIcon();
694    }
695
696    private boolean isPackageUnavailable(PackageManager pm) {
697        try {
698            return pm.getPackageInfo(packageName, 0) == null;
699        } catch (NameNotFoundException ex) {
700            return true;
701        }
702    }
703
704    /**
705     * @hide
706     */
707    @Override protected ApplicationInfo getApplicationInfo() {
708        return this;
709    }
710}
711