ResolveInfo.java revision 6d8dfbd8149942f25f2b9643a12f1fb38f3be834
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
196d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackbornimport android.content.ComponentName;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.Collator;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Information that is returned from resolving an intent
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * against an IntentFilter. This partially corresponds to
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information collected from the AndroidManifest.xml's
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <intent> tags.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ResolveInfo implements Parcelable {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38ca756bfd97d668c8e865c6247ef923b0aad9b065Jeff Hamilton     * The activity or broadcast receiver that corresponds to this resolution match,
39ca756bfd97d668c8e865c6247ef923b0aad9b065Jeff Hamilton     * if this resolution is for an activity or broadcast receiver. One and only one of this and
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * serviceInfo must be non-null.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ActivityInfo activityInfo;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The service that corresponds to this resolution match, if this
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resolution is for a service. One and only one of this and
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * activityInfo must be non-null.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ServiceInfo serviceInfo;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The IntentFilter that was matched for this ResolveInfo.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IntentFilter filter;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The declared priority of this match.  Comes from the "priority"
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * attribute or, if not set, defaults to 0.  Higher values are a higher
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * priority.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int priority;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Order of result according to the user's preference.  If the user
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has not set a preference for this result, the value is 0; higher
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values are a higher priority.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int preferredOrder;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The system's evaluation of how well the activity matches the
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IntentFilter.  This is a match constant, a combination of
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link IntentFilter#MATCH_CATEGORY_MASK IntentFilter.MATCH_CATEGORY_MASK}
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and {@link IntentFilter#MATCH_ADJUSTMENT_MASK IntentFiler.MATCH_ADJUSTMENT_MASK}.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int match;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Only set when returned by
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link PackageManager#queryIntentActivityOptions}, this tells you
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which of the given specific intents this result came from.  0 is the
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * first in the list, < 0 means it came from the generic Intent query.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int specificIndex = -1;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This filter has specified the Intent.CATEGORY_DEFAULT, meaning it
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like to be considered a default action that the user can
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perform on this data.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isDefault;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A string resource identifier (in the package's resources) of this
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * match's label.  From the "label" attribute or, if not set, 0.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int labelRes;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The actual string retrieve from <var>labelRes</var> or null if none
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was provided.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence nonLocalizedLabel;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A drawable resource identifier (in the package's resources) of this
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * match's icon.  From the "icon" attribute or, if not set, 0.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int icon;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
112eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * Optional -- if non-null, the {@link #labelRes} and {@link #icon}
113eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * resources will be loaded from this package, rather than the one
114eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     * containing the resolved component.
115eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn     */
116eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    public String resolvePackageName;
117d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn
118d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn    /**
119d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn     * @hide Target comes from system process?
120d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn     */
121d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn    public boolean system;
122d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn
123eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current textual label associated with this resolution.  This
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will call back on the given PackageManager to load the label from
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the application.
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the label can be loaded; usually
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a CharSequence containing the resolutions's label.  If the
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item does not have a label, its name is returned.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CharSequence loadLabel(PackageManager pm) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nonLocalizedLabel != null) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nonLocalizedLabel;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
138eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        CharSequence label;
139eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (resolvePackageName != null && labelRes != 0) {
140eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            label = pm.getText(resolvePackageName, labelRes, null);
141eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (label != null) {
1422aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy                return label.toString().trim();
143eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
144eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = ci.applicationInfo;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (labelRes != 0) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            label = pm.getText(ci.packageName, labelRes, ai);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (label != null) {
1502aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy                return label.toString().trim();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1532aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy
1542aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy        CharSequence data = ci.loadLabel(pm);
1552aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy        // Make the data safe
1562aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy        if (data != null) data = data.toString().trim();
1572aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy        return data;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the current graphical icon associated with this resolution.  This
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will call back on the given PackageManager to load the icon from
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the application.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pm A PackageManager from which the icon can be loaded; usually
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the PackageManager from which you originally retrieved this item.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a Drawable containing the resolution's icon.  If the
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item does not have an icon, the default activity icon is returned.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable loadIcon(PackageManager pm) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable dr;
173eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (resolvePackageName != null && icon != 0) {
174eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            dr = pm.getDrawable(resolvePackageName, icon, null);
175eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            if (dr != null) {
176eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                return dr;
177eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            }
178eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
17907330791116513710d879c45b2f095cd314cbfd0Jeff Brown        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
18007330791116513710d879c45b2f095cd314cbfd0Jeff Brown        ApplicationInfo ai = ci.applicationInfo;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (icon != 0) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dr = pm.getDrawable(ci.packageName, icon, ai);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dr != null) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return dr;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ci.loadIcon(pm);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the icon resource identifier to use for this match.  If the
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * match defines an icon, that is used; else if the activity defines
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an icon, that is used; else, the application icon is used.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The icon associated with this match.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getIconResource() {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (icon != 0) return icon;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (activityInfo != null) return activityInfo.getIconResource();
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (serviceInfo != null) return serviceInfo.getIconResource();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(Printer pw, String prefix) {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (filter != null) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "Filter:");
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filter.dump(pw, prefix + "  ");
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pw.println(prefix + "priority=" + priority
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " preferredOrder=" + preferredOrder
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " match=0x" + Integer.toHexString(match)
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " specificIndex=" + specificIndex
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " isDefault=" + isDefault);
214eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (resolvePackageName != null) {
215eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println(prefix + "resolvePackageName=" + resolvePackageName);
216eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
217eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        if (labelRes != 0 || nonLocalizedLabel != null || icon != 0) {
218eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes)
219eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + " nonLocalizedLabel=" + nonLocalizedLabel
220eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn                    + " icon=0x" + Integer.toHexString(icon));
221eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (activityInfo != null) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "ActivityInfo:");
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activityInfo.dump(pw, prefix + "  ");
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (serviceInfo != null) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println(prefix + "ServiceInfo:");
227eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn            serviceInfo.dump(pw, prefix + "  ");
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ResolveInfo() {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2348da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn    public ResolveInfo(ResolveInfo orig) {
2358da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        activityInfo = orig.activityInfo;
2368da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        serviceInfo = orig.serviceInfo;
2378da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        filter = orig.filter;
2388da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        priority = orig.priority;
2398da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        preferredOrder = orig.preferredOrder;
2408da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        match = orig.match;
2418da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        specificIndex = orig.specificIndex;
2428da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        labelRes = orig.labelRes;
2438da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        nonLocalizedLabel = orig.nonLocalizedLabel;
2448da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        icon = orig.icon;
2458da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        resolvePackageName = orig.resolvePackageName;
2468da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn        system = orig.system;
2478da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn    }
2488da429e80d1778d7bcfbfbd64355c70fb466b3ceDianne Hackborn
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
2516d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        StringBuilder sb = new StringBuilder(128);
2526d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        sb.append("ResolveInfo{");
2536d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        sb.append(Integer.toHexString(System.identityHashCode(this)));
2546d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        sb.append(' ');
2556d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        ComponentName.appendShortString(sb, ci.packageName, ci.name);
2566d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        if (priority != 0) {
2576d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            sb.append(" p=");
2586d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            sb.append(priority);
2596d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        }
2606d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        if (preferredOrder != 0) {
2616d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            sb.append(" o=");
2626d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn            sb.append(preferredOrder);
2636d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        }
2646d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        sb.append(" m=0x");
2656d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        sb.append(Integer.toHexString(match));
2666d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        sb.append('}');
2676d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn        return sb.toString();
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel dest, int parcelableFlags) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (activityInfo != null) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(1);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activityInfo.writeToParcel(dest, parcelableFlags);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (serviceInfo != null) {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(2);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            serviceInfo.writeToParcel(dest, parcelableFlags);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(0);
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (filter != null) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(1);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filter.writeToParcel(dest, parcelableFlags);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(0);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(priority);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(preferredOrder);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(match);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(specificIndex);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(labelRes);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest.writeInt(icon);
297eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        dest.writeString(resolvePackageName);
298d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn        dest.writeInt(system ? 1 : 0);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Creator<ResolveInfo> CREATOR
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Creator<ResolveInfo>() {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo createFromParcel(Parcel source) {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new ResolveInfo(source);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ResolveInfo[] newArray(int size) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new ResolveInfo[size];
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ResolveInfo(Parcel source) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (source.readInt()) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1:
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activityInfo = ActivityInfo.CREATOR.createFromParcel(source);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                serviceInfo = null;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 2:
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                serviceInfo = ServiceInfo.CREATOR.createFromParcel(source);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activityInfo = null;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                activityInfo = null;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                serviceInfo = null;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (source.readInt() != 0) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            filter = IntentFilter.CREATOR.createFromParcel(source);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        priority = source.readInt();
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        preferredOrder = source.readInt();
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        match = source.readInt();
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        specificIndex = source.readInt();
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        labelRes = source.readInt();
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nonLocalizedLabel
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        icon = source.readInt();
337eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn        resolvePackageName = source.readString();
338d99b293d5f11b784d7406f5398bc654920b42482Dianne Hackborn        system = source.readInt() != 0;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class DisplayNameComparator
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            implements Comparator<ResolveInfo> {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public DisplayNameComparator(PackageManager pm) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPM = pm;
3450256c6f8d31c95f730d286b9e2ebae94736f7098Adam Powell            mCollator.setStrength(Collator.PRIMARY);
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final int compare(ResolveInfo a, ResolveInfo b) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence  sa = a.loadLabel(mPM);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa == null) sa = a.activityInfo.name;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence  sb = b.loadLabel(mPM);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sb == null) sb = b.activityInfo.name;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3540256c6f8d31c95f730d286b9e2ebae94736f7098Adam Powell            return mCollator.compare(sa.toString(), sb.toString());
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3570256c6f8d31c95f730d286b9e2ebae94736f7098Adam Powell        private final Collator   mCollator = Collator.getInstance();
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private PackageManager   mPM;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
361