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.os.UserHandle; 25 import android.text.TextUtils; 26 import android.util.Printer; 27 28 import java.text.Collator; 29 import java.util.Comparator; 30 31 /** 32 * Base class containing information common to all package items held by 33 * the package manager. This provides a very common basic set of attributes: 34 * a label, icon, and meta-data. This class is not intended 35 * to be used by itself; it is simply here to share common definitions 36 * between all items returned by the package manager. As such, it does not 37 * itself implement Parcelable, but does provide convenience methods to assist 38 * in the implementation of Parcelable in subclasses. 39 */ 40 public class PackageItemInfo { 41 /** 42 * Public name of this item. From the "android:name" attribute. 43 */ 44 public String name; 45 46 /** 47 * Name of the package that this item is in. 48 */ 49 public String packageName; 50 51 /** 52 * A string resource identifier (in the package's resources) of this 53 * component's label. From the "label" attribute or, if not set, 0. 54 */ 55 public int labelRes; 56 57 /** 58 * The string provided in the AndroidManifest file, if any. You 59 * probably don't want to use this. You probably want 60 * {@link PackageManager#getApplicationLabel} 61 */ 62 public CharSequence nonLocalizedLabel; 63 64 /** 65 * A drawable resource identifier (in the package's resources) of this 66 * component's icon. From the "icon" attribute or, if not set, 0. 67 */ 68 public int icon; 69 70 /** 71 * A drawable resource identifier (in the package's resources) of this 72 * component's banner. From the "banner" attribute or, if not set, 0. 73 */ 74 public int banner; 75 76 /** 77 * A drawable resource identifier (in the package's resources) of this 78 * component's logo. Logos may be larger/wider than icons and are 79 * displayed by certain UI elements in place of a name or name/icon 80 * combination. From the "logo" attribute or, if not set, 0. 81 */ 82 public int logo; 83 84 /** 85 * Additional meta-data associated with this component. This field 86 * will only be filled in if you set the 87 * {@link PackageManager#GET_META_DATA} flag when requesting the info. 88 */ 89 public Bundle metaData; 90 91 /** 92 * If different of UserHandle.USER_NULL, The icon of this item will be the one of that user. 93 * @hide 94 */ 95 public int showUserIcon; 96 97 public PackageItemInfo() { 98 showUserIcon = UserHandle.USER_NULL; 99 } 100 101 public PackageItemInfo(PackageItemInfo orig) { 102 name = orig.name; 103 if (name != null) name = name.trim(); 104 packageName = orig.packageName; 105 labelRes = orig.labelRes; 106 nonLocalizedLabel = orig.nonLocalizedLabel; 107 if (nonLocalizedLabel != null) nonLocalizedLabel = nonLocalizedLabel.toString().trim(); 108 icon = orig.icon; 109 banner = orig.banner; 110 logo = orig.logo; 111 metaData = orig.metaData; 112 showUserIcon = orig.showUserIcon; 113 } 114 115 /** 116 * Retrieve the current textual label associated with this item. This 117 * will call back on the given PackageManager to load the label from 118 * the application. 119 * 120 * @param pm A PackageManager from which the label can be loaded; usually 121 * the PackageManager from which you originally retrieved this item. 122 * 123 * @return Returns a CharSequence containing the item's label. If the 124 * item does not have a label, its name is returned. 125 */ 126 public CharSequence loadLabel(PackageManager pm) { 127 if (nonLocalizedLabel != null) { 128 return nonLocalizedLabel; 129 } 130 if (labelRes != 0) { 131 CharSequence label = pm.getText(packageName, labelRes, getApplicationInfo()); 132 if (label != null) { 133 return label.toString().trim(); 134 } 135 } 136 if (name != null) { 137 return name; 138 } 139 return packageName; 140 } 141 142 /** 143 * Retrieve the current graphical icon associated with this item. This 144 * will call back on the given PackageManager to load the icon from 145 * the application. 146 * 147 * @param pm A PackageManager from which the icon can be loaded; usually 148 * the PackageManager from which you originally retrieved this item. 149 * 150 * @return Returns a Drawable containing the item's icon. If the 151 * item does not have an icon, the item's default icon is returned 152 * such as the default activity icon. 153 */ 154 public Drawable loadIcon(PackageManager pm) { 155 return pm.loadItemIcon(this, getApplicationInfo()); 156 } 157 158 /** 159 * Retrieve the current graphical icon associated with this item without 160 * the addition of a work badge if applicable. 161 * This will call back on the given PackageManager to load the icon from 162 * the application. 163 * 164 * @param pm A PackageManager from which the icon can be loaded; usually 165 * the PackageManager from which you originally retrieved this item. 166 * 167 * @return Returns a Drawable containing the item's icon. If the 168 * item does not have an icon, the item's default icon is returned 169 * such as the default activity icon. 170 */ 171 public Drawable loadUnbadgedIcon(PackageManager pm) { 172 return pm.loadUnbadgedItemIcon(this, getApplicationInfo()); 173 } 174 175 /** 176 * Retrieve the current graphical banner associated with this item. This 177 * will call back on the given PackageManager to load the banner from 178 * the application. 179 * 180 * @param pm A PackageManager from which the banner can be loaded; usually 181 * the PackageManager from which you originally retrieved this item. 182 * 183 * @return Returns a Drawable containing the item's banner. If the item 184 * does not have a banner, this method will return null. 185 */ 186 public Drawable loadBanner(PackageManager pm) { 187 if (banner != 0) { 188 Drawable dr = pm.getDrawable(packageName, banner, getApplicationInfo()); 189 if (dr != null) { 190 return dr; 191 } 192 } 193 return loadDefaultBanner(pm); 194 } 195 196 /** 197 * Retrieve the default graphical icon associated with this item. 198 * 199 * @param pm A PackageManager from which the icon can be loaded; usually 200 * the PackageManager from which you originally retrieved this item. 201 * 202 * @return Returns a Drawable containing the item's default icon 203 * such as the default activity icon. 204 * 205 * @hide 206 */ 207 public Drawable loadDefaultIcon(PackageManager pm) { 208 return pm.getDefaultActivityIcon(); 209 } 210 211 /** 212 * Retrieve the default graphical banner associated with this item. 213 * 214 * @param pm A PackageManager from which the banner can be loaded; usually 215 * the PackageManager from which you originally retrieved this item. 216 * 217 * @return Returns a Drawable containing the item's default banner 218 * or null if no default logo is available. 219 * 220 * @hide 221 */ 222 protected Drawable loadDefaultBanner(PackageManager pm) { 223 return null; 224 } 225 226 /** 227 * Retrieve the current graphical logo associated with this item. This 228 * will call back on the given PackageManager to load the logo from 229 * the application. 230 * 231 * @param pm A PackageManager from which the logo can be loaded; usually 232 * the PackageManager from which you originally retrieved this item. 233 * 234 * @return Returns a Drawable containing the item's logo. If the item 235 * does not have a logo, this method will return null. 236 */ 237 public Drawable loadLogo(PackageManager pm) { 238 if (logo != 0) { 239 Drawable d = pm.getDrawable(packageName, logo, getApplicationInfo()); 240 if (d != null) { 241 return d; 242 } 243 } 244 return loadDefaultLogo(pm); 245 } 246 247 /** 248 * Retrieve the default graphical logo associated with this item. 249 * 250 * @param pm A PackageManager from which the logo can be loaded; usually 251 * the PackageManager from which you originally retrieved this item. 252 * 253 * @return Returns a Drawable containing the item's default logo 254 * or null if no default logo is available. 255 * 256 * @hide 257 */ 258 protected Drawable loadDefaultLogo(PackageManager pm) { 259 return null; 260 } 261 262 /** 263 * Load an XML resource attached to the meta-data of this item. This will 264 * retrieved the name meta-data entry, and if defined call back on the 265 * given PackageManager to load its XML file from the application. 266 * 267 * @param pm A PackageManager from which the XML can be loaded; usually 268 * the PackageManager from which you originally retrieved this item. 269 * @param name Name of the meta-date you would like to load. 270 * 271 * @return Returns an XmlPullParser you can use to parse the XML file 272 * assigned as the given meta-data. If the meta-data name is not defined 273 * or the XML resource could not be found, null is returned. 274 */ 275 public XmlResourceParser loadXmlMetaData(PackageManager pm, String name) { 276 if (metaData != null) { 277 int resid = metaData.getInt(name); 278 if (resid != 0) { 279 return pm.getXml(packageName, resid, getApplicationInfo()); 280 } 281 } 282 return null; 283 } 284 285 protected void dumpFront(Printer pw, String prefix) { 286 if (name != null) { 287 pw.println(prefix + "name=" + name); 288 } 289 pw.println(prefix + "packageName=" + packageName); 290 if (labelRes != 0 || nonLocalizedLabel != null || icon != 0 || banner != 0) { 291 pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes) 292 + " nonLocalizedLabel=" + nonLocalizedLabel 293 + " icon=0x" + Integer.toHexString(icon) 294 + " banner=0x" + Integer.toHexString(banner)); 295 } 296 } 297 298 protected void dumpBack(Printer pw, String prefix) { 299 // no back here 300 } 301 302 public void writeToParcel(Parcel dest, int parcelableFlags) { 303 dest.writeString(name); 304 dest.writeString(packageName); 305 dest.writeInt(labelRes); 306 TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags); 307 dest.writeInt(icon); 308 dest.writeInt(logo); 309 dest.writeBundle(metaData); 310 dest.writeInt(banner); 311 dest.writeInt(showUserIcon); 312 } 313 314 protected PackageItemInfo(Parcel source) { 315 name = source.readString(); 316 packageName = source.readString(); 317 labelRes = source.readInt(); 318 nonLocalizedLabel 319 = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 320 icon = source.readInt(); 321 logo = source.readInt(); 322 metaData = source.readBundle(); 323 banner = source.readInt(); 324 showUserIcon = source.readInt(); 325 } 326 327 /** 328 * Get the ApplicationInfo for the application to which this item belongs, 329 * if available, otherwise returns null. 330 * 331 * @return Returns the ApplicationInfo of this item, or null if not known. 332 * 333 * @hide 334 */ 335 protected ApplicationInfo getApplicationInfo() { 336 return null; 337 } 338 339 public static class DisplayNameComparator 340 implements Comparator<PackageItemInfo> { 341 public DisplayNameComparator(PackageManager pm) { 342 mPM = pm; 343 } 344 345 public final int compare(PackageItemInfo aa, PackageItemInfo ab) { 346 CharSequence sa = aa.loadLabel(mPM); 347 if (sa == null) sa = aa.name; 348 CharSequence sb = ab.loadLabel(mPM); 349 if (sb == null) sb = ab.name; 350 return sCollator.compare(sa.toString(), sb.toString()); 351 } 352 353 private final Collator sCollator = Collator.getInstance(); 354 private PackageManager mPM; 355 } 356 } 357