Home | History | Annotate | Download | only in pm
      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 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