1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.content.pm; 18 19 import android.content.res.XmlResourceParser; 20 21 import android.graphics.drawable.Drawable; 22 import android.os.Bundle; 23 import android.os.Parcel; 24 import android.text.TextUtils; 25 import android.util.Printer; 26 27 import java.text.Collator; 28 import java.util.Comparator; 29 30 /** 31 * Base class containing information common to all package items held by 32 * the package manager. This provides a very common basic set of attributes: 33 * a label, icon, and meta-data. This class is not intended 34 * to be used by itself; it is simply here to share common definitions 35 * between all items returned by the package manager. As such, it does not 36 * itself implement Parcelable, but does provide convenience methods to assist 37 * in the implementation of Parcelable in subclasses. 38 */ 39 public class PackageItemInfo { 40 /** 41 * Public name of this item. From the "android:name" attribute. 42 */ 43 public String name; 44 45 /** 46 * Name of the package that this item is in. 47 */ 48 public String packageName; 49 50 /** 51 * A string resource identifier (in the package's resources) of this 52 * component's label. From the "label" attribute or, if not set, 0. 53 */ 54 public int labelRes; 55 56 /** 57 * The string provided in the AndroidManifest file, if any. You 58 * probably don't want to use this. You probably want 59 * {@link PackageManager#getApplicationLabel} 60 */ 61 public CharSequence nonLocalizedLabel; 62 63 /** 64 * A drawable resource identifier (in the package's resources) of this 65 * component's icon. From the "icon" attribute or, if not set, 0. 66 */ 67 public int icon; 68 69 /** 70 * A drawable resource identifier (in the package's resources) of this 71 * component's logo. Logos may be larger/wider than icons and are 72 * displayed by certain UI elements in place of a name or name/icon 73 * combination. From the "logo" attribute or, if not set, 0. 74 */ 75 public int logo; 76 77 /** 78 * Additional meta-data associated with this component. This field 79 * will only be filled in if you set the 80 * {@link PackageManager#GET_META_DATA} flag when requesting the info. 81 */ 82 public Bundle metaData; 83 PackageItemInfo()84 public PackageItemInfo() { 85 } 86 PackageItemInfo(PackageItemInfo orig)87 public PackageItemInfo(PackageItemInfo orig) { 88 name = orig.name; 89 if (name != null) name = name.trim(); 90 packageName = orig.packageName; 91 labelRes = orig.labelRes; 92 nonLocalizedLabel = orig.nonLocalizedLabel; 93 if (nonLocalizedLabel != null) nonLocalizedLabel = nonLocalizedLabel.toString().trim(); 94 icon = orig.icon; 95 logo = orig.logo; 96 metaData = orig.metaData; 97 } 98 99 /** 100 * Retrieve the current textual label associated with this item. This 101 * will call back on the given PackageManager to load the label from 102 * the application. 103 * 104 * @param pm A PackageManager from which the label can be loaded; usually 105 * the PackageManager from which you originally retrieved this item. 106 * 107 * @return Returns a CharSequence containing the item's label. If the 108 * item does not have a label, its name is returned. 109 */ loadLabel(PackageManager pm)110 public CharSequence loadLabel(PackageManager pm) { 111 if (nonLocalizedLabel != null) { 112 return nonLocalizedLabel; 113 } 114 if (labelRes != 0) { 115 CharSequence label = pm.getText(packageName, labelRes, getApplicationInfo()); 116 if (label != null) { 117 return label.toString().trim(); 118 } 119 } 120 if (name != null) { 121 return name; 122 } 123 return packageName; 124 } 125 126 /** 127 * Retrieve the current graphical icon associated with this item. This 128 * will call back on the given PackageManager to load the icon from 129 * the application. 130 * 131 * @param pm A PackageManager from which the icon can be loaded; usually 132 * the PackageManager from which you originally retrieved this item. 133 * 134 * @return Returns a Drawable containing the item's icon. If the 135 * item does not have an icon, the item's default icon is returned 136 * such as the default activity icon. 137 */ loadIcon(PackageManager pm)138 public Drawable loadIcon(PackageManager pm) { 139 if (icon != 0) { 140 Drawable dr = pm.getDrawable(packageName, icon, getApplicationInfo()); 141 if (dr != null) { 142 return dr; 143 } 144 } 145 return loadDefaultIcon(pm); 146 } 147 148 /** 149 * Retrieve the default graphical icon associated with this item. 150 * 151 * @param pm A PackageManager from which the icon can be loaded; usually 152 * the PackageManager from which you originally retrieved this item. 153 * 154 * @return Returns a Drawable containing the item's default icon 155 * such as the default activity icon. 156 * 157 * @hide 158 */ loadDefaultIcon(PackageManager pm)159 protected Drawable loadDefaultIcon(PackageManager pm) { 160 return pm.getDefaultActivityIcon(); 161 } 162 163 /** 164 * Retrieve the current graphical logo associated with this item. This 165 * will call back on the given PackageManager to load the logo from 166 * the application. 167 * 168 * @param pm A PackageManager from which the logo can be loaded; usually 169 * the PackageManager from which you originally retrieved this item. 170 * 171 * @return Returns a Drawable containing the item's logo. If the item 172 * does not have a logo, this method will return null. 173 */ loadLogo(PackageManager pm)174 public Drawable loadLogo(PackageManager pm) { 175 if (logo != 0) { 176 Drawable d = pm.getDrawable(packageName, logo, getApplicationInfo()); 177 if (d != null) { 178 return d; 179 } 180 } 181 return loadDefaultLogo(pm); 182 } 183 184 /** 185 * Retrieve the default graphical logo associated with this item. 186 * 187 * @param pm A PackageManager from which the logo can be loaded; usually 188 * the PackageManager from which you originally retrieved this item. 189 * 190 * @return Returns a Drawable containing the item's default logo 191 * or null if no default logo is available. 192 * 193 * @hide 194 */ loadDefaultLogo(PackageManager pm)195 protected Drawable loadDefaultLogo(PackageManager pm) { 196 return null; 197 } 198 199 /** 200 * Load an XML resource attached to the meta-data of this item. This will 201 * retrieved the name meta-data entry, and if defined call back on the 202 * given PackageManager to load its XML file from the application. 203 * 204 * @param pm A PackageManager from which the XML can be loaded; usually 205 * the PackageManager from which you originally retrieved this item. 206 * @param name Name of the meta-date you would like to load. 207 * 208 * @return Returns an XmlPullParser you can use to parse the XML file 209 * assigned as the given meta-data. If the meta-data name is not defined 210 * or the XML resource could not be found, null is returned. 211 */ loadXmlMetaData(PackageManager pm, String name)212 public XmlResourceParser loadXmlMetaData(PackageManager pm, String name) { 213 if (metaData != null) { 214 int resid = metaData.getInt(name); 215 if (resid != 0) { 216 return pm.getXml(packageName, resid, getApplicationInfo()); 217 } 218 } 219 return null; 220 } 221 dumpFront(Printer pw, String prefix)222 protected void dumpFront(Printer pw, String prefix) { 223 if (name != null) { 224 pw.println(prefix + "name=" + name); 225 } 226 pw.println(prefix + "packageName=" + packageName); 227 if (labelRes != 0 || nonLocalizedLabel != null || icon != 0) { 228 pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes) 229 + " nonLocalizedLabel=" + nonLocalizedLabel 230 + " icon=0x" + Integer.toHexString(icon)); 231 } 232 } 233 dumpBack(Printer pw, String prefix)234 protected void dumpBack(Printer pw, String prefix) { 235 // no back here 236 } 237 writeToParcel(Parcel dest, int parcelableFlags)238 public void writeToParcel(Parcel dest, int parcelableFlags) { 239 dest.writeString(name); 240 dest.writeString(packageName); 241 dest.writeInt(labelRes); 242 TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags); 243 dest.writeInt(icon); 244 dest.writeInt(logo); 245 dest.writeBundle(metaData); 246 } 247 PackageItemInfo(Parcel source)248 protected PackageItemInfo(Parcel source) { 249 name = source.readString(); 250 packageName = source.readString(); 251 labelRes = source.readInt(); 252 nonLocalizedLabel 253 = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 254 icon = source.readInt(); 255 logo = source.readInt(); 256 metaData = source.readBundle(); 257 } 258 259 /** 260 * Get the ApplicationInfo for the application to which this item belongs, 261 * if available, otherwise returns null. 262 * 263 * @return Returns the ApplicationInfo of this item, or null if not known. 264 * 265 * @hide 266 */ getApplicationInfo()267 protected ApplicationInfo getApplicationInfo() { 268 return null; 269 } 270 271 public static class DisplayNameComparator 272 implements Comparator<PackageItemInfo> { DisplayNameComparator(PackageManager pm)273 public DisplayNameComparator(PackageManager pm) { 274 mPM = pm; 275 } 276 compare(PackageItemInfo aa, PackageItemInfo ab)277 public final int compare(PackageItemInfo aa, PackageItemInfo ab) { 278 CharSequence sa = aa.loadLabel(mPM); 279 if (sa == null) sa = aa.name; 280 CharSequence sb = ab.loadLabel(mPM); 281 if (sb == null) sb = ab.name; 282 return sCollator.compare(sa.toString(), sb.toString()); 283 } 284 285 private final Collator sCollator = Collator.getInstance(); 286 private PackageManager mPM; 287 } 288 } 289