115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2007 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.pm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
247f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevotimport android.os.UserHandle;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.Collator;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class containing information common to all package items held by
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the package manager.  This provides a very common basic set of attributes:
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a label, icon, and meta-data.  This class is not intended
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be used by itself; it is simply here to share common definitions
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between all items returned by the package manager.  As such, it does not
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * itself implement Parcelable, but does provide convenience methods to assist
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the implementation of Parcelable in subclasses.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageItemInfo {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Public name of this item. From the "android:name" attribute.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String name;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Name of the package that this item is in.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String packageName;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A string resource identifier (in the package's resources) of this
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * component's label.  From the "label" attribute or, if not set, 0.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int labelRes;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The string provided in the AndroidManifest file, if any.  You
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * probably don't want to use this.  You probably want
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PackageManager#getApplicationLabel}
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence nonLocalizedLabel;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A drawable resource identifier (in the package's resources) of this
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * component's icon.  From the "icon" attribute or, if not set, 0.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int icon;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7181cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * A drawable resource identifier (in the package's resources) of this
72f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * component's banner.  From the "banner" attribute or, if not set, 0.
73f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     */
74f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    public int banner;
75f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
76f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    /**
77f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * A drawable resource identifier (in the package's resources) of this
7881cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * component's logo. Logos may be larger/wider than icons and are
7981cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * displayed by certain UI elements in place of a name or name/icon
8081cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * combination. From the "logo" attribute or, if not set, 0.
8181cd2e90ccdda498234384c8207afe2213714e60Adam Powell     */
8281cd2e90ccdda498234384c8207afe2213714e60Adam Powell    public int logo;
8381cd2e90ccdda498234384c8207afe2213714e60Adam Powell
8481cd2e90ccdda498234384c8207afe2213714e60Adam Powell    /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Additional meta-data associated with this component.  This field
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will only be filled in if you set the
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PackageManager#GET_META_DATA} flag when requesting the info.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Bundle metaData;
907f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot
917f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot    /**
927f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot     * If different of UserHandle.USER_NULL, The icon of this item will be the one of that user.
937f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot     * @hide
947f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot     */
957f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot    public int showUserIcon;
967f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageItemInfo() {
987f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        showUserIcon = UserHandle.USER_NULL;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageItemInfo(PackageItemInfo orig) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = orig.name;
1032aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy        if (name != null) name = name.trim();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        packageName = orig.packageName;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        labelRes = orig.labelRes;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nonLocalizedLabel = orig.nonLocalizedLabel;
1072aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy        if (nonLocalizedLabel != null) nonLocalizedLabel = nonLocalizedLabel.toString().trim();
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        icon = orig.icon;
109f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        banner = orig.banner;
11081cd2e90ccdda498234384c8207afe2213714e60Adam Powell        logo = orig.logo;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        metaData = orig.metaData;
1127f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        showUserIcon = orig.showUserIcon;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current textual label associated with this item.  This
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will call back on the given PackageManager to load the label from
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the application.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the label can be loaded; usually
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a CharSequence containing the item's label.  If the
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item does not have a label, its name is returned.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence loadLabel(PackageManager pm) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nonLocalizedLabel != null) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nonLocalizedLabel;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (labelRes != 0) {
13107330791116513710d879c45b2f095cd314cbfd0Jeff Brown            CharSequence label = pm.getText(packageName, labelRes, getApplicationInfo());
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (label != null) {
1332aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy                return label.toString().trim();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1362aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy        if (name != null) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return name;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return packageName;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
141ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current graphical icon associated with this item.  This
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will call back on the given PackageManager to load the icon from
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the application.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the icon can be loaded; usually
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a Drawable containing the item's icon.  If the
15107330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * item does not have an icon, the item's default icon is returned
15207330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * such as the default activity icon.
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable loadIcon(PackageManager pm) {
155a71e3903e5d3f38795c443c052125faede9d9ec7Alexandra Gherghina        return pm.loadItemIcon(this, getApplicationInfo());
15607330791116513710d879c45b2f095cd314cbfd0Jeff Brown    }
157a71e3903e5d3f38795c443c052125faede9d9ec7Alexandra Gherghina
15807330791116513710d879c45b2f095cd314cbfd0Jeff Brown    /**
159ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * Retrieve the current graphical icon associated with this item without
160ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * the addition of a work badge if applicable.
161ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * This will call back on the given PackageManager to load the icon from
162ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * the application.
163ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     *
164ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * @param pm A PackageManager from which the icon can be loaded; usually
165ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * the PackageManager from which you originally retrieved this item.
166ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     *
167ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * @return Returns a Drawable containing the item's icon.  If the
168ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * item does not have an icon, the item's default icon is returned
169ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     * such as the default activity icon.
170ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz     */
171ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz    public Drawable loadUnbadgedIcon(PackageManager pm) {
172ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz        return pm.loadUnbadgedItemIcon(this, getApplicationInfo());
173ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz    }
174ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz
175ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz    /**
176f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * Retrieve the current graphical banner associated with this item.  This
177f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * will call back on the given PackageManager to load the banner from
178f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * the application.
179f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     *
180f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * @param pm A PackageManager from which the banner can be loaded; usually
181f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * the PackageManager from which you originally retrieved this item.
182f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     *
183f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * @return Returns a Drawable containing the item's banner.  If the item
184f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * does not have a banner, this method will return null.
185f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     */
186f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    public Drawable loadBanner(PackageManager pm) {
187f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        if (banner != 0) {
188f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            Drawable dr = pm.getDrawable(packageName, banner, getApplicationInfo());
189f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            if (dr != null) {
190f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima                return dr;
191f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima            }
192f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        }
193f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        return loadDefaultBanner(pm);
194f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
195f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
196f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    /**
19707330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * Retrieve the default graphical icon associated with this item.
19807330791116513710d879c45b2f095cd314cbfd0Jeff Brown     *
19907330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * @param pm A PackageManager from which the icon can be loaded; usually
20007330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * the PackageManager from which you originally retrieved this item.
20107330791116513710d879c45b2f095cd314cbfd0Jeff Brown     *
20207330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * @return Returns a Drawable containing the item's default icon
20307330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * such as the default activity icon.
20407330791116513710d879c45b2f095cd314cbfd0Jeff Brown     *
20507330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * @hide
20607330791116513710d879c45b2f095cd314cbfd0Jeff Brown     */
207a709314537164d959a18ee78768c69c4a9cb33c7Alexandra Gherghina    public Drawable loadDefaultIcon(PackageManager pm) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pm.getDefaultActivityIcon();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
210f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
211f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    /**
212f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * Retrieve the default graphical banner associated with this item.
213f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     *
214f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * @param pm A PackageManager from which the banner can be loaded; usually
215f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * the PackageManager from which you originally retrieved this item.
216f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     *
217f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * @return Returns a Drawable containing the item's default banner
218f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * or null if no default logo is available.
219f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     *
220f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     * @hide
221f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima     */
222f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    protected Drawable loadDefaultBanner(PackageManager pm) {
223f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        return null;
224f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima    }
225f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22781cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * Retrieve the current graphical logo associated with this item. This
22881cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * will call back on the given PackageManager to load the logo from
22981cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * the application.
23081cd2e90ccdda498234384c8207afe2213714e60Adam Powell     *
23181cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * @param pm A PackageManager from which the logo can be loaded; usually
23281cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * the PackageManager from which you originally retrieved this item.
23381cd2e90ccdda498234384c8207afe2213714e60Adam Powell     *
23481cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * @return Returns a Drawable containing the item's logo. If the item
23581cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * does not have a logo, this method will return null.
23681cd2e90ccdda498234384c8207afe2213714e60Adam Powell     */
23781cd2e90ccdda498234384c8207afe2213714e60Adam Powell    public Drawable loadLogo(PackageManager pm) {
23881cd2e90ccdda498234384c8207afe2213714e60Adam Powell        if (logo != 0) {
23981cd2e90ccdda498234384c8207afe2213714e60Adam Powell            Drawable d = pm.getDrawable(packageName, logo, getApplicationInfo());
24081cd2e90ccdda498234384c8207afe2213714e60Adam Powell            if (d != null) {
24181cd2e90ccdda498234384c8207afe2213714e60Adam Powell                return d;
24281cd2e90ccdda498234384c8207afe2213714e60Adam Powell            }
24381cd2e90ccdda498234384c8207afe2213714e60Adam Powell        }
24481cd2e90ccdda498234384c8207afe2213714e60Adam Powell        return loadDefaultLogo(pm);
24581cd2e90ccdda498234384c8207afe2213714e60Adam Powell    }
24681cd2e90ccdda498234384c8207afe2213714e60Adam Powell
24781cd2e90ccdda498234384c8207afe2213714e60Adam Powell    /**
24881cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * Retrieve the default graphical logo associated with this item.
24981cd2e90ccdda498234384c8207afe2213714e60Adam Powell     *
25081cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * @param pm A PackageManager from which the logo can be loaded; usually
25181cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * the PackageManager from which you originally retrieved this item.
25281cd2e90ccdda498234384c8207afe2213714e60Adam Powell     *
25381cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * @return Returns a Drawable containing the item's default logo
25481cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * or null if no default logo is available.
25581cd2e90ccdda498234384c8207afe2213714e60Adam Powell     *
25681cd2e90ccdda498234384c8207afe2213714e60Adam Powell     * @hide
25781cd2e90ccdda498234384c8207afe2213714e60Adam Powell     */
25881cd2e90ccdda498234384c8207afe2213714e60Adam Powell    protected Drawable loadDefaultLogo(PackageManager pm) {
25981cd2e90ccdda498234384c8207afe2213714e60Adam Powell        return null;
26081cd2e90ccdda498234384c8207afe2213714e60Adam Powell    }
26181cd2e90ccdda498234384c8207afe2213714e60Adam Powell
26281cd2e90ccdda498234384c8207afe2213714e60Adam Powell    /**
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Load an XML resource attached to the meta-data of this item.  This will
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * retrieved the name meta-data entry, and if defined call back on the
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * given PackageManager to load its XML file from the application.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the XML can be loaded; usually
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param name Name of the meta-date you would like to load.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an XmlPullParser you can use to parse the XML file
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * assigned as the given meta-data.  If the meta-data name is not defined
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or the XML resource could not be found, null is returned.
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public XmlResourceParser loadXmlMetaData(PackageManager pm, String name) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (metaData != null) {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int resid = metaData.getInt(name);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (resid != 0) {
27907330791116513710d879c45b2f095cd314cbfd0Jeff Brown                return pm.getXml(packageName, resid, getApplicationInfo());
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28464442c11555d828a41af0b8a58ab933357889061Amith Yamasani
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dumpFront(Printer pw, String prefix) {
28612527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        if (name != null) {
28712527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn            pw.println(prefix + "name=" + name);
28812527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix + "packageName=" + packageName);
290f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        if (labelRes != 0 || nonLocalizedLabel != null || icon != 0 || banner != 0) {
29112527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn            pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes)
29212527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn                    + " nonLocalizedLabel=" + nonLocalizedLabel
293f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima                    + " icon=0x" + Integer.toHexString(icon)
294f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima                    + " banner=0x" + Integer.toHexString(banner));
29512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn        }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dumpBack(Printer pw, String prefix) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // no back here
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int parcelableFlags) {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(name);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeString(packageName);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(labelRes);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(icon);
30881cd2e90ccdda498234384c8207afe2213714e60Adam Powell        dest.writeInt(logo);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeBundle(metaData);
310f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        dest.writeInt(banner);
3117f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        dest.writeInt(showUserIcon);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31307330791116513710d879c45b2f095cd314cbfd0Jeff Brown
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected PackageItemInfo(Parcel source) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        name = source.readString();
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        packageName = source.readString();
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        labelRes = source.readInt();
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nonLocalizedLabel
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        icon = source.readInt();
32181cd2e90ccdda498234384c8207afe2213714e60Adam Powell        logo = source.readInt();
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        metaData = source.readBundle();
323f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima        banner = source.readInt();
3247f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot        showUserIcon = source.readInt();
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32707330791116513710d879c45b2f095cd314cbfd0Jeff Brown    /**
32807330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * Get the ApplicationInfo for the application to which this item belongs,
32907330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * if available, otherwise returns null.
33007330791116513710d879c45b2f095cd314cbfd0Jeff Brown     *
33107330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * @return Returns the ApplicationInfo of this item, or null if not known.
33207330791116513710d879c45b2f095cd314cbfd0Jeff Brown     *
33307330791116513710d879c45b2f095cd314cbfd0Jeff Brown     * @hide
33407330791116513710d879c45b2f095cd314cbfd0Jeff Brown     */
33507330791116513710d879c45b2f095cd314cbfd0Jeff Brown    protected ApplicationInfo getApplicationInfo() {
33607330791116513710d879c45b2f095cd314cbfd0Jeff Brown        return null;
33707330791116513710d879c45b2f095cd314cbfd0Jeff Brown    }
33807330791116513710d879c45b2f095cd314cbfd0Jeff Brown
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class DisplayNameComparator
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            implements Comparator<PackageItemInfo> {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DisplayNameComparator(PackageManager pm) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int compare(PackageItemInfo aa, PackageItemInfo ab) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence  sa = aa.loadLabel(mPM);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa == null) sa = aa.name;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence  sb = ab.loadLabel(mPM);
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sb == null) sb = ab.name;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sCollator.compare(sa.toString(), sb.toString());
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Collator   sCollator = Collator.getInstance();
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private PackageManager   mPM;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
357