• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.content.pm;
18 
19 import android.content.pm.PackageManager.NameNotFoundException;
20 import android.content.res.Resources;
21 import android.graphics.drawable.Drawable;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 import android.util.Printer;
25 
26 import java.text.Collator;
27 import 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  */
34 public 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 
dump(Printer pw, String prefix)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      */
hasRtlSupport()529     public boolean hasRtlSupport() {
530         return (flags & FLAG_SUPPORTS_RTL) == FLAG_SUPPORTS_RTL;
531     }
532 
533     public static class DisplayNameComparator
534             implements Comparator<ApplicationInfo> {
DisplayNameComparator(PackageManager pm)535         public DisplayNameComparator(PackageManager pm) {
536             mPM = pm;
537         }
538 
compare(ApplicationInfo aa, ApplicationInfo ab)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 
ApplicationInfo()556     public ApplicationInfo() {
557     }
558 
ApplicationInfo(ApplicationInfo orig)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 
toString()589     public String toString() {
590         return "ApplicationInfo{"
591             + Integer.toHexString(System.identityHashCode(this))
592             + " " + packageName + "}";
593     }
594 
describeContents()595     public int describeContents() {
596         return 0;
597     }
598 
writeToParcel(Parcel dest, int parcelableFlags)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 
ApplicationInfo(Parcel source)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      */
loadDescription(PackageManager pm)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      */
disableCompatibilityMode()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      */
loadDefaultIcon(PackageManager pm)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 
isPackageUnavailable(PackageManager pm)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      */
getApplicationInfo()722     @Override protected ApplicationInfo getApplicationInfo() {
723         return this;
724     }
725 }
726