• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package android.content.pm;
2 
3 import android.os.Parcel;
4 import android.os.Parcelable;
5 import android.util.Printer;
6 
7 import java.text.Collator;
8 import java.util.Comparator;
9 
10 /**
11  * Information you can retrieve about a particular application.  This
12  * corresponds to information collected from the AndroidManifest.xml's
13  * <application> tag.
14  */
15 public class ApplicationInfo extends PackageItemInfo implements Parcelable {
16 
17     /**
18      * Default task affinity of all activities in this application. See
19      * {@link ActivityInfo#taskAffinity} for more information.  This comes
20      * from the "taskAffinity" attribute.
21      */
22     public String taskAffinity;
23 
24     /**
25      * Optional name of a permission required to be able to access this
26      * application's components.  From the "permission" attribute.
27      */
28     public String permission;
29 
30     /**
31      * The name of the process this application should run in.  From the
32      * "process" attribute or, if not set, the same as
33      * <var>packageName</var>.
34      */
35     public String processName;
36 
37     /**
38      * Class implementing the Application object.  From the "class"
39      * attribute.
40      */
41     public String className;
42 
43     /**
44      * A style resource identifier (in the package's resources) of the
45      * description of an application.  From the "description" attribute
46      * or, if not set, 0.
47      */
48     public int descriptionRes;
49 
50     /**
51      * A style resource identifier (in the package's resources) of the
52      * default visual theme of the application.  From the "theme" attribute
53      * or, if not set, 0.
54      */
55     public int theme;
56 
57     /**
58      * Class implementing the Application's manage space
59      * functionality.  From the "manageSpaceActivity"
60      * attribute. This is an optional attribute and will be null if
61      * applications don't specify it in their manifest
62      */
63     public String manageSpaceActivityName;
64 
65     /**
66      * Class implementing the Application's backup functionality.  From
67      * the "backupAgent" attribute.  This is an optional attribute and
68      * will be null if the application does not specify it in its manifest.
69      *
70      * <p>If android:allowBackup is set to false, this attribute is ignored.
71      *
72      * {@hide}
73      */
74     public String backupAgentName;
75 
76     /**
77      * Value for {@link #flags}: if set, this application is installed in the
78      * device's system image.
79      */
80     public static final int FLAG_SYSTEM = 1<<0;
81 
82     /**
83      * Value for {@link #flags}: set to true if this application would like to
84      * allow debugging of its
85      * code, even when installed on a non-development system.  Comes
86      * from {@link android.R.styleable#AndroidManifestApplication_debuggable
87      * android:debuggable} of the &lt;application&gt; tag.
88      */
89     public static final int FLAG_DEBUGGABLE = 1<<1;
90 
91     /**
92      * Value for {@link #flags}: set to true if this application has code
93      * associated with it.  Comes
94      * from {@link android.R.styleable#AndroidManifestApplication_hasCode
95      * android:hasCode} of the &lt;application&gt; tag.
96      */
97     public static final int FLAG_HAS_CODE = 1<<2;
98 
99     /**
100      * Value for {@link #flags}: set to true if this application is persistent.
101      * Comes from {@link android.R.styleable#AndroidManifestApplication_persistent
102      * android:persistent} of the &lt;application&gt; tag.
103      */
104     public static final int FLAG_PERSISTENT = 1<<3;
105 
106     /**
107      * Value for {@link #flags}: set to true if this application holds the
108      * {@link android.Manifest.permission#FACTORY_TEST} permission and the
109      * device is running in factory test mode.
110      */
111     public static final int FLAG_FACTORY_TEST = 1<<4;
112 
113     /**
114      * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
115      * Comes from {@link android.R.styleable#AndroidManifestApplication_allowTaskReparenting
116      * android:allowTaskReparenting} of the &lt;application&gt; tag.
117      */
118     public static final int FLAG_ALLOW_TASK_REPARENTING = 1<<5;
119 
120     /**
121      * Value for {@link #flags}: default value for the corresponding ActivityInfo flag.
122      * Comes from {@link android.R.styleable#AndroidManifestApplication_allowClearUserData
123      * android:allowClearUserData} of the &lt;application&gt; tag.
124      */
125     public static final int FLAG_ALLOW_CLEAR_USER_DATA = 1<<6;
126 
127     /**
128      * Value for {@link #flags}: this is set if this application has been
129      * install as an update to a built-in system application.
130      */
131     public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7;
132 
133     /**
134      * Value for {@link #flags}: this is set of the application has specified
135      * {@link android.R.styleable#AndroidManifestApplication_testOnly
136      * android:testOnly} to be true.
137      */
138     public static final int FLAG_TEST_ONLY = 1<<8;
139 
140     /**
141      * Value for {@link #flags}: true when the application's window can be
142      * reduced in size for smaller screens.  Corresponds to
143      * {@link android.R.styleable#AndroidManifestSupportsScreens_smallScreens
144      * android:smallScreens}.
145      */
146     public static final int FLAG_SUPPORTS_SMALL_SCREENS = 1<<9;
147 
148     /**
149      * Value for {@link #flags}: true when the application's window can be
150      * displayed on normal screens.  Corresponds to
151      * {@link android.R.styleable#AndroidManifestSupportsScreens_normalScreens
152      * android:normalScreens}.
153      */
154     public static final int FLAG_SUPPORTS_NORMAL_SCREENS = 1<<10;
155 
156     /**
157      * Value for {@link #flags}: true when the application's window can be
158      * increased in size for larger screens.  Corresponds to
159      * {@link android.R.styleable#AndroidManifestSupportsScreens_largeScreens
160      * android:smallScreens}.
161      */
162     public static final int FLAG_SUPPORTS_LARGE_SCREENS = 1<<11;
163 
164     /**
165      * Value for {@link #flags}: true when the application knows how to adjust
166      * its UI for different screen sizes.  Corresponds to
167      * {@link android.R.styleable#AndroidManifestSupportsScreens_resizeable
168      * android:resizeable}.
169      */
170     public static final int FLAG_RESIZEABLE_FOR_SCREENS = 1<<12;
171 
172     /**
173      * Value for {@link #flags}: true when the application knows how to
174      * accomodate different screen densities.  Corresponds to
175      * {@link android.R.styleable#AndroidManifestSupportsScreens_anyDensity
176      * android:anyDensity}.
177      */
178     public static final int FLAG_SUPPORTS_SCREEN_DENSITIES = 1<<13;
179 
180     /**
181      * Value for {@link #flags}: this is false if the application has set
182      * its android:allowBackup to false, true otherwise.
183      *
184      * {@hide}
185      */
186     public static final int FLAG_ALLOW_BACKUP = 1<<14;
187 
188     /**
189      * Value for {@link #flags}: this is false if the application has set
190      * its android:killAfterRestore to false, true otherwise.
191      *
192      * <p>If android:allowBackup is set to false or no android:backupAgent
193      * is specified, this flag will be ignored.
194      *
195      * {@hide}
196      */
197     public static final int FLAG_KILL_AFTER_RESTORE = 1<<15;
198 
199     /**
200      * Value for {@link #flags}: this is true if the application has set
201      * its android:restoreNeedsApplication to true, false otherwise.
202      *
203      * <p>If android:allowBackup is set to false or no android:backupAgent
204      * is specified, this flag will be ignored.
205      *
206      * {@hide}
207      */
208     public static final int FLAG_RESTORE_NEEDS_APPLICATION = 1<<16;
209 
210     /**
211      * Flags associated with the application.  Any combination of
212      * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE},
213      * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and
214      * {@link #FLAG_ALLOW_TASK_REPARENTING}
215      * {@link #FLAG_ALLOW_CLEAR_USER_DATA}, {@link #FLAG_UPDATED_SYSTEM_APP},
216      * {@link #FLAG_TEST_ONLY}, {@link #FLAG_SUPPORTS_SMALL_SCREENS},
217      * {@link #FLAG_SUPPORTS_NORMAL_SCREENS},
218      * {@link #FLAG_SUPPORTS_LARGE_SCREENS}, {@link #FLAG_RESIZEABLE_FOR_SCREENS},
219      * {@link #FLAG_SUPPORTS_SCREEN_DENSITIES}.
220      */
221     public int flags = 0;
222 
223     /**
224      * Full path to the location of this package.
225      */
226     public String sourceDir;
227 
228     /**
229      * Full path to the location of the publicly available parts of this package (i.e. the resources
230      * and manifest).  For non-forward-locked apps this will be the same as {@link #sourceDir).
231      */
232     public String publicSourceDir;
233 
234     /**
235      * Paths to all shared libraries this application is linked against.  This
236      * field is only set if the {@link PackageManager#GET_SHARED_LIBRARY_FILES
237      * PackageManager.GET_SHARED_LIBRARY_FILES} flag was used when retrieving
238      * the structure.
239      */
240     public String[] sharedLibraryFiles;
241 
242     /**
243      * Full path to a directory assigned to the package for its persistent
244      * data.
245      */
246     public String dataDir;
247 
248     /**
249      * The kernel user-ID that has been assigned to this application;
250      * currently this is not a unique ID (multiple applications can have
251      * the same uid).
252      */
253     public int uid;
254 
255     /**
256      * The minimum SDK version this application targets.  It may run on earlier
257      * versions, but it knows how to work with any new behavior added at this
258      * version.  Will be {@link android.os.Build.VERSION_CODES#CUR_DEVELOPMENT}
259      * if this is a development build and the app is targeting that.  You should
260      * compare that this number is >= the SDK version number at which your
261      * behavior was introduced.
262      */
263     public int targetSdkVersion;
264 
265     /**
266      * When false, indicates that all components within this application are
267      * considered disabled, regardless of their individually set enabled status.
268      */
269     public boolean enabled = true;
270 
dump(Printer pw, String prefix)271     public void dump(Printer pw, String prefix) {
272         super.dumpFront(pw, prefix);
273         if (className != null) {
274             pw.println(prefix + "className=" + className);
275         }
276         if (permission != null) {
277             pw.println(prefix + "permission=" + permission);
278         }
279         pw.println(prefix + "uid=" + uid + " taskAffinity=" + taskAffinity);
280         if (theme != 0) {
281             pw.println(prefix + "theme=0x" + Integer.toHexString(theme));
282         }
283         pw.println(prefix + "flags=0x" + Integer.toHexString(flags)
284                 + " processName=" + processName);
285         pw.println(prefix + "sourceDir=" + sourceDir);
286         pw.println(prefix + "publicSourceDir=" + publicSourceDir);
287         pw.println(prefix + "dataDir=" + dataDir);
288         if (sharedLibraryFiles != null) {
289             pw.println(prefix + "sharedLibraryFiles=" + sharedLibraryFiles);
290         }
291         pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion);
292         if (manageSpaceActivityName != null) {
293             pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName);
294         }
295         if (descriptionRes != 0) {
296             pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes));
297         }
298         super.dumpBack(pw, prefix);
299     }
300 
301     public static class DisplayNameComparator
302             implements Comparator<ApplicationInfo> {
DisplayNameComparator(PackageManager pm)303         public DisplayNameComparator(PackageManager pm) {
304             mPM = pm;
305         }
306 
compare(ApplicationInfo aa, ApplicationInfo ab)307         public final int compare(ApplicationInfo aa, ApplicationInfo ab) {
308             CharSequence  sa = mPM.getApplicationLabel(aa);
309             if (sa == null) {
310                 sa = aa.packageName;
311             }
312             CharSequence  sb = mPM.getApplicationLabel(ab);
313             if (sb == null) {
314                 sb = ab.packageName;
315             }
316 
317             return sCollator.compare(sa.toString(), sb.toString());
318         }
319 
320         private final Collator   sCollator = Collator.getInstance();
321         private PackageManager   mPM;
322     }
323 
ApplicationInfo()324     public ApplicationInfo() {
325     }
326 
ApplicationInfo(ApplicationInfo orig)327     public ApplicationInfo(ApplicationInfo orig) {
328         super(orig);
329         taskAffinity = orig.taskAffinity;
330         permission = orig.permission;
331         processName = orig.processName;
332         className = orig.className;
333         theme = orig.theme;
334         flags = orig.flags;
335         sourceDir = orig.sourceDir;
336         publicSourceDir = orig.publicSourceDir;
337         sharedLibraryFiles = orig.sharedLibraryFiles;
338         dataDir = orig.dataDir;
339         uid = orig.uid;
340         targetSdkVersion = orig.targetSdkVersion;
341         enabled = orig.enabled;
342         manageSpaceActivityName = orig.manageSpaceActivityName;
343         descriptionRes = orig.descriptionRes;
344     }
345 
346 
toString()347     public String toString() {
348         return "ApplicationInfo{"
349             + Integer.toHexString(System.identityHashCode(this))
350             + " " + packageName + "}";
351     }
352 
describeContents()353     public int describeContents() {
354         return 0;
355     }
356 
writeToParcel(Parcel dest, int parcelableFlags)357     public void writeToParcel(Parcel dest, int parcelableFlags) {
358         super.writeToParcel(dest, parcelableFlags);
359         dest.writeString(taskAffinity);
360         dest.writeString(permission);
361         dest.writeString(processName);
362         dest.writeString(className);
363         dest.writeInt(theme);
364         dest.writeInt(flags);
365         dest.writeString(sourceDir);
366         dest.writeString(publicSourceDir);
367         dest.writeStringArray(sharedLibraryFiles);
368         dest.writeString(dataDir);
369         dest.writeInt(uid);
370         dest.writeInt(targetSdkVersion);
371         dest.writeInt(enabled ? 1 : 0);
372         dest.writeString(manageSpaceActivityName);
373         dest.writeString(backupAgentName);
374         dest.writeInt(descriptionRes);
375     }
376 
377     public static final Parcelable.Creator<ApplicationInfo> CREATOR
378             = new Parcelable.Creator<ApplicationInfo>() {
379         public ApplicationInfo createFromParcel(Parcel source) {
380             return new ApplicationInfo(source);
381         }
382         public ApplicationInfo[] newArray(int size) {
383             return new ApplicationInfo[size];
384         }
385     };
386 
ApplicationInfo(Parcel source)387     private ApplicationInfo(Parcel source) {
388         super(source);
389         taskAffinity = source.readString();
390         permission = source.readString();
391         processName = source.readString();
392         className = source.readString();
393         theme = source.readInt();
394         flags = source.readInt();
395         sourceDir = source.readString();
396         publicSourceDir = source.readString();
397         sharedLibraryFiles = source.readStringArray();
398         dataDir = source.readString();
399         uid = source.readInt();
400         targetSdkVersion = source.readInt();
401         enabled = source.readInt() != 0;
402         manageSpaceActivityName = source.readString();
403         backupAgentName = source.readString();
404         descriptionRes = source.readInt();
405     }
406 
407     /**
408      * Retrieve the textual description of the application.  This
409      * will call back on the given PackageManager to load the description from
410      * the application.
411      *
412      * @param pm A PackageManager from which the label can be loaded; usually
413      * the PackageManager from which you originally retrieved this item.
414      *
415      * @return Returns a CharSequence containing the application's description.
416      * If there is no description, null is returned.
417      */
loadDescription(PackageManager pm)418     public CharSequence loadDescription(PackageManager pm) {
419         if (descriptionRes != 0) {
420             CharSequence label = pm.getText(packageName, descriptionRes, null);
421             if (label != null) {
422                 return label;
423             }
424         }
425         return null;
426     }
427 
428     /**
429      * Disable compatibility mode
430      *
431      * @hide
432      */
disableCompatibilityMode()433     public void disableCompatibilityMode() {
434         flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
435                 FLAG_SUPPORTS_SMALL_SCREENS | FLAG_RESIZEABLE_FOR_SCREENS |
436                 FLAG_SUPPORTS_SCREEN_DENSITIES);
437     }
438 }
439