/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.content.pm; import java.util.Comparator; import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.os.Parcelable; import android.util.Printer; /** * Information that is returned from resolving an intent against an * IntentFilter. This partially corresponds to information collected from the * AndroidManifest.xml's <intent> tags. */ public class ResolveInfo implements Parcelable { /** * The activity that corresponds to this resolution match, if this * resolution is for an activity. One and only one of this and serviceInfo * must be non-null. */ public ActivityInfo activityInfo; /** * The IntentFilter that was matched for this ResolveInfo. */ /** * The service that corresponds to this resolution match, if this * resolution is for a service. One and only one of this and * activityInfo must be non-null. */ public ServiceInfo serviceInfo; public IntentFilter filter; /** * The declared priority of this match. Comes from the "priority" attribute * or, if not set, defaults to 0. Higher values are a higher priority. */ public int priority; /** * Order of result according to the user's preference. If the user has not * set a preference for this result, the value is 0; higher values are a * higher priority. */ public int preferredOrder; /** * The system's evaluation of how well the activity matches the * IntentFilter. This is a match constant, a combination of * {@link IntentFilter#MATCH_CATEGORY_MASK IntentFilter.MATCH_CATEGORY_MASK} * and {@link IntentFilter#MATCH_ADJUSTMENT_MASK * IntentFiler.MATCH_ADJUSTMENT_MASK}. */ public int match; /** * Only set when returned by * {@link PackageManager#queryIntentActivityOptions}, this tells you which * of the given specific intents this result came from. 0 is the first in * the list, < 0 means it came from the generic Intent query. */ public int specificIndex = -1; /** * This filter has specified the Intent.CATEGORY_DEFAULT, meaning it would * like to be considered a default action that the user can perform on this * data. */ public boolean isDefault; /** * A string resource identifier (in the package's resources) of this match's * label. From the "label" attribute or, if not set, 0. */ public int labelRes; /** * The actual string retrieve from <var>labelRes</var> or null if none was * provided. */ public CharSequence nonLocalizedLabel; /** * A drawable resource identifier (in the package's resources) of this * match's icon. From the "icon" attribute or, if not set, 0. */ public int icon; /** * Optional -- if non-null, the {@link #labelRes} and {@link #icon} * resources will be loaded from this package, rather than the one * containing the resolved component. */ public String resolvePackageName; /** * Retrieve the current textual label associated with this resolution. This * will call back on the given PackageManager to load the label from the * application. * * @param pm * A PackageManager from which the label can be loaded; usually * the PackageManager from which you originally retrieved this * item. * * @return Returns a CharSequence containing the resolutions's label. If the * item does not have a label, its name is returned. */ public CharSequence loadLabel(PackageManager pm) { if (nonLocalizedLabel != null) { return nonLocalizedLabel; } CharSequence label; if (resolvePackageName != null && labelRes != 0) { label = pm.getText(resolvePackageName, labelRes, null); if (label != null) { return label.toString().trim(); } } ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo; ApplicationInfo ai = ci.applicationInfo; if (labelRes != 0) { label = pm.getText(ci.packageName, labelRes, ai); if (label != null) { return label.toString().trim(); } } CharSequence data = ci.loadLabel(pm); // Make the data safe if (data != null) data = data.toString().trim(); return data; } /** * Retrieve the current graphical icon associated with this resolution. This * will call back on the given PackageManager to load the icon from the * application. * * @param pm * A PackageManager from which the icon can be loaded; usually * the PackageManager from which you originally retrieved this * item. * * @return Returns a Drawable containing the resolution's icon. If the item * does not have an icon, the default activity icon is returned. */ public Drawable loadIcon(PackageManager pm) { Drawable dr; if (resolvePackageName != null && icon != 0) { dr = pm.getDrawable(resolvePackageName, icon, null); if (dr != null) { return dr; } } ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo; ApplicationInfo ai = ci.applicationInfo; if (icon != 0) { dr = pm.getDrawable(ci.packageName, icon, ai); if (dr != null) { return dr; } } return ci.loadIcon(pm); } /** * Return the icon resource identifier to use for this match. If the match * defines an icon, that is used; else if the activity defines an icon, that * is used; else, the application icon is used. * * @return The icon associated with this match. */ public final int getIconResource() { if (icon != 0) return icon; if (activityInfo != null) return activityInfo.getIconResource(); if (serviceInfo != null) return serviceInfo.getIconResource(); return 0; } public void dump(Printer pw, String prefix) { if (filter != null) { pw.println(prefix + "Filter:"); filter.dump(pw, prefix + " "); } pw.println(prefix + "priority=" + priority + " preferredOrder=" + preferredOrder + " match=0x" + Integer.toHexString(match) + " specificIndex=" + specificIndex + " isDefault=" + isDefault); if (resolvePackageName != null) { pw.println(prefix + "resolvePackageName=" + resolvePackageName); } if (labelRes != 0 || nonLocalizedLabel != null || icon != 0) { pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes) + " nonLocalizedLabel=" + nonLocalizedLabel + " icon=0x" + Integer.toHexString(icon)); } if (activityInfo != null) { pw.println(prefix + "ActivityInfo:"); activityInfo.dump(pw, prefix + " "); }else if (serviceInfo != null) { pw.println(prefix + "ServiceInfo:"); serviceInfo.dump(pw, prefix + " "); } } public ResolveInfo() { } public String toString() { ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo; return "ResolveInfo{" //+ Integer.toHexString(System.identityHashCode(this)) + " " + ci.name + " p=" + priority + " o=" + preferredOrder + " m=0x" + Integer.toHexString(match) + "}"; } public int describeContents() { return 0; } public static class DisplayNameComparator implements Comparator<ResolveInfo> { public DisplayNameComparator(PackageManager pm) { mPM = pm; } public final int compare(ResolveInfo a, ResolveInfo b) { CharSequence sa = a.loadLabel(mPM); if (sa == null) sa = a.activityInfo.name; CharSequence sb = b.loadLabel(mPM); if (sb == null) sb = b.activityInfo.name; return 0; } private PackageManager mPM; } }