ResolveInfo.java revision eb034652c2037a47ebfd99779e8383bb8bb528af
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.pm;
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.Collator;
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator;
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Information that is returned from resolving an intent
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * against an IntentFilter. This partially corresponds to
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information collected from the AndroidManifest.xml's
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <intent> tags.
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ResolveInfo implements Parcelable {
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The activity that corresponds to this resolution match, if this
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resolution is for an activity.  One and only one of this and
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * serviceInfo must be non-null.
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityInfo activityInfo;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The service that corresponds to this resolution match, if this
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resolution is for a service. One and only one of this and
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activityInfo must be non-null.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ServiceInfo serviceInfo;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The IntentFilter that was matched for this ResolveInfo.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IntentFilter filter;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The declared priority of this match.  Comes from the "priority"
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * attribute or, if not set, defaults to 0.  Higher values are a higher
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int priority;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Order of result according to the user's preference.  If the user
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has not set a preference for this result, the value is 0; higher
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values are a higher priority.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int preferredOrder;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The system's evaluation of how well the activity matches the
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IntentFilter.  This is a match constant, a combination of
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link IntentFilter#MATCH_CATEGORY_MASK IntentFilter.MATCH_CATEGORY_MASK}
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link IntentFilter#MATCH_ADJUSTMENT_MASK IntentFiler.MATCH_ADJUSTMENT_MASK}.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int match;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Only set when returned by
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PackageManager#queryIntentActivityOptions}, this tells you
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which of the given specific intents this result came from.  0 is the
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first in the list, < 0 means it came from the generic Intent query.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int specificIndex = -1;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This filter has specified the Intent.CATEGORY_DEFAULT, meaning it
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like to be considered a default action that the user can
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perform on this data.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isDefault;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A string resource identifier (in the package's resources) of this
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * match's label.  From the "label" attribute or, if not set, 0.
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int labelRes;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The actual string retrieve from <var>labelRes</var> or null if none
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was provided.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence nonLocalizedLabel;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A drawable resource identifier (in the package's resources) of this
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * match's icon.  From the "icon" attribute or, if not set, 0.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int icon;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
95eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Optional -- if non-null, the {@link #labelRes} and {@link #icon}
96eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * resources will be loaded from this package, rather than the one
97eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * containing the resolved component.
98eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
99eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public String resolvePackageName;
100eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn
101eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current textual label associated with this resolution.  This
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will call back on the given PackageManager to load the label from
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the application.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the label can be loaded; usually
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a CharSequence containing the resolutions's label.  If the
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item does not have a label, its name is returned.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence loadLabel(PackageManager pm) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nonLocalizedLabel != null) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nonLocalizedLabel;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
116eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        CharSequence label;
117eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (resolvePackageName != null && labelRes != 0) {
118eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            label = pm.getText(resolvePackageName, labelRes, null);
119eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (label != null) {
120eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                return label;
121eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
122eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = ci.applicationInfo;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (labelRes != 0) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            label = pm.getText(ci.packageName, labelRes, ai);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (label != null) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return label;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ci.loadLabel(pm);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current graphical icon associated with this resolution.  This
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will call back on the given PackageManager to load the icon from
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the application.
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the icon can be loaded; usually
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a Drawable containing the resolution's icon.  If the
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item does not have an icon, the default activity icon is returned.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable loadIcon(PackageManager pm) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = ci.applicationInfo;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable dr;
149eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (resolvePackageName != null && icon != 0) {
150eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            dr = pm.getDrawable(resolvePackageName, icon, null);
151eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (dr != null) {
152eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                return dr;
153eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
154eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (icon != 0) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dr = pm.getDrawable(ci.packageName, icon, ai);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dr != null) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return dr;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ci.loadIcon(pm);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the icon resource identifier to use for this match.  If the
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * match defines an icon, that is used; else if the activity defines
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an icon, that is used; else, the application icon is used.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The icon associated with this match.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getIconResource() {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (icon != 0) return icon;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (activityInfo != null) return activityInfo.getIconResource();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (serviceInfo != null) return serviceInfo.getIconResource();
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(Printer pw, String prefix) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (filter != null) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "Filter:");
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filter.dump(pw, prefix + "  ");
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix + "priority=" + priority
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " preferredOrder=" + preferredOrder
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " match=0x" + Integer.toHexString(match)
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " specificIndex=" + specificIndex
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " isDefault=" + isDefault);
188eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (resolvePackageName != null) {
189eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println(prefix + "resolvePackageName=" + resolvePackageName);
190eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
191eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (labelRes != 0 || nonLocalizedLabel != null || icon != 0) {
192eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes)
193eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + " nonLocalizedLabel=" + nonLocalizedLabel
194eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + " icon=0x" + Integer.toHexString(icon));
195eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (activityInfo != null) {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "ActivityInfo:");
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activityInfo.dump(pw, prefix + "  ");
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (serviceInfo != null) {
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "ServiceInfo:");
201eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            serviceInfo.dump(pw, prefix + "  ");
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ResolveInfo() {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "ResolveInfo{"
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + Integer.toHexString(System.identityHashCode(this))
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + " " + ci.name + " p=" + priority + " o="
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + preferredOrder + " m=0x" + Integer.toHexString(match) + "}";
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int parcelableFlags) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (activityInfo != null) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(1);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activityInfo.writeToParcel(dest, parcelableFlags);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (serviceInfo != null) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(2);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            serviceInfo.writeToParcel(dest, parcelableFlags);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(0);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (filter != null) {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(1);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filter.writeToParcel(dest, parcelableFlags);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(0);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(priority);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(preferredOrder);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(match);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(specificIndex);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(labelRes);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(icon);
243eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        dest.writeString(resolvePackageName);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<ResolveInfo> CREATOR
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Creator<ResolveInfo>() {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo createFromParcel(Parcel source) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new ResolveInfo(source);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo[] newArray(int size) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new ResolveInfo[size];
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ResolveInfo(Parcel source) {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (source.readInt()) {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1:
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activityInfo = ActivityInfo.CREATOR.createFromParcel(source);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                serviceInfo = null;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 2:
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                serviceInfo = ServiceInfo.CREATOR.createFromParcel(source);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activityInfo = null;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activityInfo = null;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                serviceInfo = null;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (source.readInt() != 0) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filter = IntentFilter.CREATOR.createFromParcel(source);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        priority = source.readInt();
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        preferredOrder = source.readInt();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        match = source.readInt();
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        specificIndex = source.readInt();
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        labelRes = source.readInt();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nonLocalizedLabel
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        icon = source.readInt();
282eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        resolvePackageName = source.readString();
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class DisplayNameComparator
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            implements Comparator<ResolveInfo> {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DisplayNameComparator(PackageManager pm) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int compare(ResolveInfo a, ResolveInfo b) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence  sa = a.loadLabel(mPM);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa == null) sa = a.activityInfo.name;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence  sb = b.loadLabel(mPM);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sb == null) sb = b.activityInfo.name;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sCollator.compare(sa.toString(), sb.toString());
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Collator   sCollator = Collator.getInstance();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private PackageManager   mPM;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
304