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 19aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganovimport android.annotation.NonNull; 20aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganovimport android.annotation.SystemApi; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 267f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevotimport android.os.UserHandle; 27aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganovimport android.text.BidiFormatter; 28e630f353222509474c8aa739e00bacfc3d906663fionaxuimport android.text.Html; 29aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganovimport android.text.TextPaint; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 32be2865a60a470c6248bdd7155f79d57239baa0f1fionaxuimport android.text.BidiFormatter; 33be2865a60a470c6248bdd7155f79d57239baa0f1fionaxuimport android.text.TextPaint; 34be2865a60a470c6248bdd7155f79d57239baa0f1fionaxuimport android.text.Html; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.Collator; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class containing information common to all package items held by 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the package manager. This provides a very common basic set of attributes: 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a label, icon, and meta-data. This class is not intended 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be used by itself; it is simply here to share common definitions 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between all items returned by the package manager. As such, it does not 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * itself implement Parcelable, but does provide convenience methods to assist 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the implementation of Parcelable in subclasses. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageItemInfo { 48aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov private static final float MAX_LABEL_SIZE_PX = 500f; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Public name of this item. From the "android:name" attribute. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String name; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Name of the package that this item is in. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String packageName; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A string resource identifier (in the package's resources) of this 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * component's label. From the "label" attribute or, if not set, 0. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int labelRes; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The string provided in the AndroidManifest file, if any. You 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * probably don't want to use this. You probably want 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PackageManager#getApplicationLabel} 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedLabel; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A drawable resource identifier (in the package's resources) of this 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * component's icon. From the "icon" attribute or, if not set, 0. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int icon; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7981cd2e90ccdda498234384c8207afe2213714e60Adam Powell * A drawable resource identifier (in the package's resources) of this 80f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * component's banner. From the "banner" attribute or, if not set, 0. 81f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima */ 82f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima public int banner; 83f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima 84f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima /** 85f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * A drawable resource identifier (in the package's resources) of this 8681cd2e90ccdda498234384c8207afe2213714e60Adam Powell * component's logo. Logos may be larger/wider than icons and are 8781cd2e90ccdda498234384c8207afe2213714e60Adam Powell * displayed by certain UI elements in place of a name or name/icon 8881cd2e90ccdda498234384c8207afe2213714e60Adam Powell * combination. From the "logo" attribute or, if not set, 0. 8981cd2e90ccdda498234384c8207afe2213714e60Adam Powell */ 9081cd2e90ccdda498234384c8207afe2213714e60Adam Powell public int logo; 9181cd2e90ccdda498234384c8207afe2213714e60Adam Powell 9281cd2e90ccdda498234384c8207afe2213714e60Adam Powell /** 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Additional meta-data associated with this component. This field 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will only be filled in if you set the 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link PackageManager#GET_META_DATA} flag when requesting the info. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle metaData; 987f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot 997f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot /** 1007f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot * If different of UserHandle.USER_NULL, The icon of this item will be the one of that user. 1017f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot * @hide 1027f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot */ 1037f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot public int showUserIcon; 1047f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageItemInfo() { 1067f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot showUserIcon = UserHandle.USER_NULL; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageItemInfo(PackageItemInfo orig) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = orig.name; 1112aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy if (name != null) name = name.trim(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = orig.packageName; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labelRes = orig.labelRes; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedLabel = orig.nonLocalizedLabel; 1152aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy if (nonLocalizedLabel != null) nonLocalizedLabel = nonLocalizedLabel.toString().trim(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project icon = orig.icon; 117f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima banner = orig.banner; 11881cd2e90ccdda498234384c8207afe2213714e60Adam Powell logo = orig.logo; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project metaData = orig.metaData; 1207f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot showUserIcon = orig.showUserIcon; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current textual label associated with this item. 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 item'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 } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (labelRes != 0) { 13907330791116513710d879c45b2f095cd314cbfd0Jeff Brown CharSequence label = pm.getText(packageName, labelRes, getApplicationInfo()); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (label != null) { 1412aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy return label.toString().trim(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1442aba11f6b9b7b202742a11797084a23d0f940c35Romain Guy if (name != null) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return packageName; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 149be2865a60a470c6248bdd7155f79d57239baa0f1fionaxu 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 151aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * Same as {@link #loadLabel(PackageManager)} with the addition that 152aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * the returned label is safe for being presented in the UI since it 153aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * will not contain new lines and the length will be limited to a 154aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * reasonable amount. This prevents a malicious party to influence UI 155aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * layout via the app label misleading the user into performing a 156aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * detrimental for them action. If the label is too long it will be 157aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * truncated and ellipsized at the end. 158aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * 159aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * @param pm A PackageManager from which the label can be loaded; usually 160aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * the PackageManager from which you originally retrieved this item 161aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * @return Returns a CharSequence containing the item's label. If the 162aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * item does not have a label, its name is returned. 163aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * 164aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov * @hide 165aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov */ 166aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov @SystemApi 167aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm) { 168aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov // loadLabel() always returns non-null 169e630f353222509474c8aa739e00bacfc3d906663fionaxu String label = loadLabel(pm).toString(); 170e630f353222509474c8aa739e00bacfc3d906663fionaxu // strip HTML tags to avoid <br> and other tags overwriting original message 171e630f353222509474c8aa739e00bacfc3d906663fionaxu String labelStr = Html.fromHtml(label).toString(); 172aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov 173aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov // If the label contains new line characters it may push the UI 174aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov // down to hide a part of it. Labels shouldn't have new line 175aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov // characters, so just truncate at the first time one is seen. 176aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov final int labelLength = labelStr.length(); 177aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov int offset = 0; 178aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov while (offset < labelLength) { 179aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov final int codePoint = labelStr.codePointAt(offset); 180aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov final int type = Character.getType(codePoint); 181aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov if (type == Character.LINE_SEPARATOR 182aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov || type == Character.CONTROL 183aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov || type == Character.PARAGRAPH_SEPARATOR) { 184aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov labelStr = labelStr.substring(0, offset); 185aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov break; 186aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov } 187e630f353222509474c8aa739e00bacfc3d906663fionaxu // replace all non-break space to " " in order to be trimmed 188e630f353222509474c8aa739e00bacfc3d906663fionaxu if (type == Character.SPACE_SEPARATOR) { 189e630f353222509474c8aa739e00bacfc3d906663fionaxu labelStr = labelStr.substring(0, offset) + " " + labelStr.substring(offset + 190e630f353222509474c8aa739e00bacfc3d906663fionaxu Character.charCount(codePoint)); 191e630f353222509474c8aa739e00bacfc3d906663fionaxu } 192aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov offset += Character.charCount(codePoint); 193aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov } 194aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov 195e630f353222509474c8aa739e00bacfc3d906663fionaxu labelStr = labelStr.trim(); 196aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov if (labelStr.isEmpty()) { 197e630f353222509474c8aa739e00bacfc3d906663fionaxu return packageName; 198aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov } 199aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov TextPaint paint = new TextPaint(); 200aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov paint.setTextSize(42); 201aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov 202aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov return TextUtils.ellipsize(labelStr, paint, MAX_LABEL_SIZE_PX, 203aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov TextUtils.TruncateAt.END); 204aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov } 205aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov 206aa8b0d74f4f4e14c3591582bad7baead0d30e655Svetoslav Ganov /** 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current graphical icon associated with this item. This 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will call back on the given PackageManager to load the icon from 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm A PackageManager from which the icon can be loaded; usually 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PackageManager from which you originally retrieved this item. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a Drawable containing the item's icon. If the 21507330791116513710d879c45b2f095cd314cbfd0Jeff Brown * item does not have an icon, the item's default icon is returned 21607330791116513710d879c45b2f095cd314cbfd0Jeff Brown * such as the default activity icon. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable loadIcon(PackageManager pm) { 219a71e3903e5d3f38795c443c052125faede9d9ec7Alexandra Gherghina return pm.loadItemIcon(this, getApplicationInfo()); 22007330791116513710d879c45b2f095cd314cbfd0Jeff Brown } 221a71e3903e5d3f38795c443c052125faede9d9ec7Alexandra Gherghina 22207330791116513710d879c45b2f095cd314cbfd0Jeff Brown /** 223ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * Retrieve the current graphical icon associated with this item without 224ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * the addition of a work badge if applicable. 225ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * This will call back on the given PackageManager to load the icon from 226ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * the application. 227ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * 228ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * @param pm A PackageManager from which the icon can be loaded; usually 229ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * the PackageManager from which you originally retrieved this item. 230ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * 231ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * @return Returns a Drawable containing the item's icon. If the 232ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * item does not have an icon, the item's default icon is returned 233ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz * such as the default activity icon. 234ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz */ 235ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz public Drawable loadUnbadgedIcon(PackageManager pm) { 236ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz return pm.loadUnbadgedItemIcon(this, getApplicationInfo()); 237ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz } 238ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz 239ec2d48b96d1f95fb266914df294a27c210f8c3f5Benjamin Franz /** 240f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * Retrieve the current graphical banner associated with this item. This 241f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * will call back on the given PackageManager to load the banner from 242f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * the application. 243f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * 244f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * @param pm A PackageManager from which the banner can be loaded; usually 245f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * the PackageManager from which you originally retrieved this item. 246f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * 247f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * @return Returns a Drawable containing the item's banner. If the item 248f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * does not have a banner, this method will return null. 249f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima */ 250f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima public Drawable loadBanner(PackageManager pm) { 251f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima if (banner != 0) { 252f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima Drawable dr = pm.getDrawable(packageName, banner, getApplicationInfo()); 253f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima if (dr != null) { 254f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima return dr; 255f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima } 256f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima } 257f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima return loadDefaultBanner(pm); 258f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima } 259f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima 260f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima /** 26107330791116513710d879c45b2f095cd314cbfd0Jeff Brown * Retrieve the default graphical icon associated with this item. 26207330791116513710d879c45b2f095cd314cbfd0Jeff Brown * 26307330791116513710d879c45b2f095cd314cbfd0Jeff Brown * @param pm A PackageManager from which the icon can be loaded; usually 26407330791116513710d879c45b2f095cd314cbfd0Jeff Brown * the PackageManager from which you originally retrieved this item. 26507330791116513710d879c45b2f095cd314cbfd0Jeff Brown * 26607330791116513710d879c45b2f095cd314cbfd0Jeff Brown * @return Returns a Drawable containing the item's default icon 26707330791116513710d879c45b2f095cd314cbfd0Jeff Brown * such as the default activity icon. 26807330791116513710d879c45b2f095cd314cbfd0Jeff Brown * 26907330791116513710d879c45b2f095cd314cbfd0Jeff Brown * @hide 27007330791116513710d879c45b2f095cd314cbfd0Jeff Brown */ 271a709314537164d959a18ee78768c69c4a9cb33c7Alexandra Gherghina public Drawable loadDefaultIcon(PackageManager pm) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pm.getDefaultActivityIcon(); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 274f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima 275f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima /** 276f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * Retrieve the default graphical banner associated with this item. 277f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * 278f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * @param pm A PackageManager from which the banner can be loaded; usually 279f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * the PackageManager from which you originally retrieved this item. 280f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * 281f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * @return Returns a Drawable containing the item's default banner 282f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * or null if no default logo is available. 283f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * 284f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima * @hide 285f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima */ 286f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima protected Drawable loadDefaultBanner(PackageManager pm) { 287f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima return null; 288f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima } 289f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29181cd2e90ccdda498234384c8207afe2213714e60Adam Powell * Retrieve the current graphical logo associated with this item. This 29281cd2e90ccdda498234384c8207afe2213714e60Adam Powell * will call back on the given PackageManager to load the logo from 29381cd2e90ccdda498234384c8207afe2213714e60Adam Powell * the application. 29481cd2e90ccdda498234384c8207afe2213714e60Adam Powell * 29581cd2e90ccdda498234384c8207afe2213714e60Adam Powell * @param pm A PackageManager from which the logo can be loaded; usually 29681cd2e90ccdda498234384c8207afe2213714e60Adam Powell * the PackageManager from which you originally retrieved this item. 29781cd2e90ccdda498234384c8207afe2213714e60Adam Powell * 29881cd2e90ccdda498234384c8207afe2213714e60Adam Powell * @return Returns a Drawable containing the item's logo. If the item 29981cd2e90ccdda498234384c8207afe2213714e60Adam Powell * does not have a logo, this method will return null. 30081cd2e90ccdda498234384c8207afe2213714e60Adam Powell */ 30181cd2e90ccdda498234384c8207afe2213714e60Adam Powell public Drawable loadLogo(PackageManager pm) { 30281cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (logo != 0) { 30381cd2e90ccdda498234384c8207afe2213714e60Adam Powell Drawable d = pm.getDrawable(packageName, logo, getApplicationInfo()); 30481cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (d != null) { 30581cd2e90ccdda498234384c8207afe2213714e60Adam Powell return d; 30681cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 30781cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 30881cd2e90ccdda498234384c8207afe2213714e60Adam Powell return loadDefaultLogo(pm); 30981cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 31081cd2e90ccdda498234384c8207afe2213714e60Adam Powell 31181cd2e90ccdda498234384c8207afe2213714e60Adam Powell /** 31281cd2e90ccdda498234384c8207afe2213714e60Adam Powell * Retrieve the default graphical logo associated with this item. 31381cd2e90ccdda498234384c8207afe2213714e60Adam Powell * 31481cd2e90ccdda498234384c8207afe2213714e60Adam Powell * @param pm A PackageManager from which the logo can be loaded; usually 31581cd2e90ccdda498234384c8207afe2213714e60Adam Powell * the PackageManager from which you originally retrieved this item. 31681cd2e90ccdda498234384c8207afe2213714e60Adam Powell * 31781cd2e90ccdda498234384c8207afe2213714e60Adam Powell * @return Returns a Drawable containing the item's default logo 31881cd2e90ccdda498234384c8207afe2213714e60Adam Powell * or null if no default logo is available. 31981cd2e90ccdda498234384c8207afe2213714e60Adam Powell * 32081cd2e90ccdda498234384c8207afe2213714e60Adam Powell * @hide 32181cd2e90ccdda498234384c8207afe2213714e60Adam Powell */ 32281cd2e90ccdda498234384c8207afe2213714e60Adam Powell protected Drawable loadDefaultLogo(PackageManager pm) { 32381cd2e90ccdda498234384c8207afe2213714e60Adam Powell return null; 32481cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 32581cd2e90ccdda498234384c8207afe2213714e60Adam Powell 32681cd2e90ccdda498234384c8207afe2213714e60Adam Powell /** 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Load an XML resource attached to the meta-data of this item. This will 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * retrieved the name meta-data entry, and if defined call back on the 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given PackageManager to load its XML file from the application. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pm A PackageManager from which the XML can be loaded; usually 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the PackageManager from which you originally retrieved this item. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name Name of the meta-date you would like to load. 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns an XmlPullParser you can use to parse the XML file 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * assigned as the given meta-data. If the meta-data name is not defined 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or the XML resource could not be found, null is returned. 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public XmlResourceParser loadXmlMetaData(PackageManager pm, String name) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (metaData != null) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resid = metaData.getInt(name); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resid != 0) { 34307330791116513710d879c45b2f095cd314cbfd0Jeff Brown return pm.getXml(packageName, resid, getApplicationInfo()); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34864442c11555d828a41af0b8a58ab933357889061Amith Yamasani 3496ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn /** 3506ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn * @hide Flag for dumping: include all details. 3516ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn */ 3526ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn public static final int DUMP_FLAG_DETAILS = 1<<0; 3536ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn 3546ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn /** 3556ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn * @hide Flag for dumping: include nested ApplicationInfo. 3566ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn */ 3576ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn public static final int DUMP_FLAG_APPLICATION = 1<<1; 3586ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn 3596ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn /** 3606ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn * @hide Flag for dumping: all flags to dump everything. 3616ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn */ 3626ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn public static final int DUMP_FLAG_ALL = DUMP_FLAG_DETAILS | DUMP_FLAG_APPLICATION; 3636ac42aeed905181b484f97a53db57a17134ef7a8Dianne Hackborn 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dumpFront(Printer pw, String prefix) { 36512527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn if (name != null) { 36612527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn pw.println(prefix + "name=" + name); 36712527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "packageName=" + packageName); 369f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima if (labelRes != 0 || nonLocalizedLabel != null || icon != 0 || banner != 0) { 37012527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn pw.println(prefix + "labelRes=0x" + Integer.toHexString(labelRes) 37112527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn + " nonLocalizedLabel=" + nonLocalizedLabel 372f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima + " icon=0x" + Integer.toHexString(icon) 373f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima + " banner=0x" + Integer.toHexString(banner)); 37412527f9fb1cb0a1ad3be8149c1c88a0e731cb4d6Dianne Hackborn } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dumpBack(Printer pw, String prefix) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no back here 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int parcelableFlags) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(name); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(packageName); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(labelRes); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel(nonLocalizedLabel, dest, parcelableFlags); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(icon); 38781cd2e90ccdda498234384c8207afe2213714e60Adam Powell dest.writeInt(logo); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeBundle(metaData); 389f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima dest.writeInt(banner); 3907f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot dest.writeInt(showUserIcon); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39207330791116513710d879c45b2f095cd314cbfd0Jeff Brown 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected PackageItemInfo(Parcel source) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = source.readString(); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = source.readString(); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project labelRes = source.readInt(); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nonLocalizedLabel 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project icon = source.readInt(); 40081cd2e90ccdda498234384c8207afe2213714e60Adam Powell logo = source.readInt(); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project metaData = source.readBundle(); 402f78e312db2aa7653ddc021e7dc58ce48f95ba047Jose Lima banner = source.readInt(); 4037f7b0c759e2970178ef68805b21f06a26e24eb76Nicolas Prevot showUserIcon = source.readInt(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40607330791116513710d879c45b2f095cd314cbfd0Jeff Brown /** 40707330791116513710d879c45b2f095cd314cbfd0Jeff Brown * Get the ApplicationInfo for the application to which this item belongs, 40807330791116513710d879c45b2f095cd314cbfd0Jeff Brown * if available, otherwise returns null. 40907330791116513710d879c45b2f095cd314cbfd0Jeff Brown * 41007330791116513710d879c45b2f095cd314cbfd0Jeff Brown * @return Returns the ApplicationInfo of this item, or null if not known. 41107330791116513710d879c45b2f095cd314cbfd0Jeff Brown * 41207330791116513710d879c45b2f095cd314cbfd0Jeff Brown * @hide 41307330791116513710d879c45b2f095cd314cbfd0Jeff Brown */ 41407330791116513710d879c45b2f095cd314cbfd0Jeff Brown protected ApplicationInfo getApplicationInfo() { 41507330791116513710d879c45b2f095cd314cbfd0Jeff Brown return null; 41607330791116513710d879c45b2f095cd314cbfd0Jeff Brown } 41707330791116513710d879c45b2f095cd314cbfd0Jeff Brown 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class DisplayNameComparator 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project implements Comparator<PackageItemInfo> { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DisplayNameComparator(PackageManager pm) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPM = pm; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int compare(PackageItemInfo aa, PackageItemInfo ab) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence sa = aa.loadLabel(mPM); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa == null) sa = aa.name; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence sb = ab.loadLabel(mPM); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sb == null) sb = ab.name; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sCollator.compare(sa.toString(), sb.toString()); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Collator sCollator = Collator.getInstance(); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPM; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 436