1ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn/* 2ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * Copyright (C) 2009 The Android Open Source Project 3ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * 4ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * you may not use this file except in compliance with the License. 6ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * You may obtain a copy of the License at 7ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * 8ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * 10ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * Unless required by applicable law or agreed to in writing, software 11ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * See the License for the specific language governing permissions and 14ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn * limitations under the License. 15ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn */ 16ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornpackage com.android.settings.fuelgauge; 17ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 18ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport com.android.settings.R; 19ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport com.android.settings.fuelgauge.PowerUsageDetail.DrainType; 20ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 21ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.content.Context; 22ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.content.pm.ApplicationInfo; 23ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.content.pm.PackageInfo; 24ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.content.pm.PackageManager; 25ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException; 26ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.graphics.drawable.Drawable; 27ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.os.Handler; 28ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport android.os.BatteryStats.Uid; 29ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 30ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport java.util.ArrayList; 31ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackbornimport java.util.HashMap; 32ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 33c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang/** 34c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang * Contains information about package name, icon image, power usage about an 35c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang * application or a system service. 36c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang */ 37c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tangpublic class BatterySipper implements Comparable<BatterySipper> { 38ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final Context mContext; 39a521d11796ffced26319e32184a40383f191e1aeAmith Yamasani /* Cache cleared when PowerUsageSummary is destroyed */ 40a521d11796ffced26319e32184a40383f191e1aeAmith Yamasani static final HashMap<String,UidToDetail> sUidCache = new HashMap<String,UidToDetail>(); 41ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final ArrayList<BatterySipper> mRequestQueue; 42ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final Handler mHandler; 43ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn String name; 44ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn Drawable icon; 45ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn int iconId; // For passing to the detail screen. 46ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn Uid uidObj; 47ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn double value; 48ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn double[] values; 49ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn DrainType drainType; 50ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn long usageTime; 51ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn long cpuTime; 52ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn long gpsTime; 53cb818619c669d4257a4df969dd03eff479ba84d0Dianne Hackborn long wifiRunningTime; 54ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn long cpuFgTime; 55be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn long wakeLockTime; 56133581e267f513d00a8e50a80fded16535f2821dJeff Sharkey long mobileRxBytes; 57133581e267f513d00a8e50a80fded16535f2821dJeff Sharkey long mobileTxBytes; 58133581e267f513d00a8e50a80fded16535f2821dJeff Sharkey long wifiRxBytes; 59133581e267f513d00a8e50a80fded16535f2821dJeff Sharkey long wifiTxBytes; 60ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn double percent; 61ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn double noCoveragePercent; 62ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn String defaultPackageName; 63c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang String[] mPackages; 64ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 65ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn static class UidToDetail { 66ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn String name; 67ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn String packageName; 68ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn Drawable icon; 69ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 70ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 71ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn BatterySipper(Context context, ArrayList<BatterySipper> requestQueue, 72ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn Handler handler, String label, DrainType drainType, 73ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn int iconId, Uid uid, double[] values) { 74ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn mContext = context; 75ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn mRequestQueue = requestQueue; 76ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn mHandler = handler; 77ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn this.values = values; 78ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn name = label; 79ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn this.drainType = drainType; 80ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (iconId > 0) { 81ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn icon = mContext.getResources().getDrawable(iconId); 82ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 83ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (values != null) value = values[0]; 84ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if ((label == null || iconId == 0) && uid != null) { 85ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn getQuickNameIconForUid(uid); 86ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 87ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn uidObj = uid; 88ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 89ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 90ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn double getSortValue() { 91ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn return value; 92ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 93ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 94ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn double[] getValues() { 95ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn return values; 96ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 97ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 98c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang public Drawable getIcon() { 99ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn return icon; 100ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 101ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 102c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang /** 103c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang * Gets the application name 104c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang */ 105c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang public String getLabel() { 106c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang return name; 107c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang } 108c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang 109c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang @Override 110ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn public int compareTo(BatterySipper other) { 111ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn // Return the flipped value because we want the items in descending order 112dffcc39ba5cd82bb28e06f0664a3ac8c5f31c33fJia Arlan return Double.compare(other.getSortValue(), getSortValue()); 113ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 114ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 115c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang /** 116c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang * Gets a list of packages associated with the current user 117c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang */ 118c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang public String[] getPackages() { 119c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang return mPackages; 120c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang } 121c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang 122b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang public int getUid() { 123b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang // Bail out if the current sipper is not an App sipper. 124b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang if (uidObj == null) { 125b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang return 0; 126b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang } 127b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang return uidObj.getUid(); 128b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang } 129b9ab196bb520fed9b23aa9a259fab08084646c2cLifu Tang 130ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn void getQuickNameIconForUid(Uid uidObj) { 131ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final int uid = uidObj.getUid(); 132ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final String uidString = Integer.toString(uid); 133a521d11796ffced26319e32184a40383f191e1aeAmith Yamasani if (sUidCache.containsKey(uidString)) { 134a521d11796ffced26319e32184a40383f191e1aeAmith Yamasani UidToDetail utd = sUidCache.get(uidString); 135ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn defaultPackageName = utd.packageName; 136ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn name = utd.name; 137ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn icon = utd.icon; 138ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn return; 139ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 140ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn PackageManager pm = mContext.getPackageManager(); 141ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn String[] packages = pm.getPackagesForUid(uid); 142ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn icon = pm.getDefaultActivityIcon(); 143ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (packages == null) { 144ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn //name = Integer.toString(uid); 145ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (uid == 0) { 146ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn name = mContext.getResources().getString(R.string.process_kernel_label); 147ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } else if ("mediaserver".equals(name)) { 148ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn name = mContext.getResources().getString(R.string.process_mediaserver_label); 149ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 150ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn iconId = R.drawable.ic_power_system; 151ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn icon = mContext.getResources().getDrawable(iconId); 152ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn return; 153ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } else { 154ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn //name = packages[0]; 155ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 156c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang if (mHandler != null) { 157c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang synchronized (mRequestQueue) { 158c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mRequestQueue.add(this); 159c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang } 160ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 161ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 162ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 163c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang public static void clearUidCache() { 164c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang sUidCache.clear(); 165c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang } 166c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang 167ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn /** 168c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang * Loads the app label and icon image and stores into the cache. 169ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn */ 170c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang public void loadNameAndIcon() { 171c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang // Bail out if the current sipper is not an App sipper. 172c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang if (uidObj == null) { 173c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang return; 174c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang } 175ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn PackageManager pm = mContext.getPackageManager(); 176ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final int uid = uidObj.getUid(); 177ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final Drawable defaultActivityIcon = pm.getDefaultActivityIcon(); 178c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mPackages = pm.getPackagesForUid(uid); 179c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang if (mPackages == null) { 180ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn name = Integer.toString(uid); 181ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn return; 182ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 183ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 184c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang String[] packageLabels = new String[mPackages.length]; 185c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang System.arraycopy(mPackages, 0, packageLabels, 0, mPackages.length); 186ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 187ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn int preferredIndex = -1; 188ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn // Convert package names to user-facing labels where possible 189ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn for (int i = 0; i < packageLabels.length; i++) { 190ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn // Check if package matches preferred package 191ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (packageLabels[i].equals(name)) preferredIndex = i; 192ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn try { 193ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn ApplicationInfo ai = pm.getApplicationInfo(packageLabels[i], 0); 194ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn CharSequence label = ai.loadLabel(pm); 195ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (label != null) { 196ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn packageLabels[i] = label.toString(); 197ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 198ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (ai.icon != 0) { 199c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang defaultPackageName = mPackages[i]; 200ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn icon = ai.loadIcon(pm); 201ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn break; 202ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 203ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } catch (NameNotFoundException e) { 204ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 205ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 206ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (icon == null) icon = defaultActivityIcon; 207ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn 208ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (packageLabels.length == 1) { 209ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn name = packageLabels[0]; 210ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } else { 211ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn // Look for an official name for this UID. 212c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang for (String pkgName : mPackages) { 213ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn try { 214ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final PackageInfo pi = pm.getPackageInfo(pkgName, 0); 215ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (pi.sharedUserLabel != 0) { 216ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final CharSequence nm = pm.getText(pkgName, 217ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn pi.sharedUserLabel, pi.applicationInfo); 218ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (nm != null) { 219ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn name = nm.toString(); 220ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (pi.applicationInfo.icon != 0) { 221ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn defaultPackageName = pkgName; 222ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn icon = pi.applicationInfo.loadIcon(pm); 223ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 224ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn break; 225ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 226ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 227ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 228ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 229ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 230ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 231ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn final String uidString = Integer.toString(uidObj.getUid()); 232ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn UidToDetail utd = new UidToDetail(); 233ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn utd.name = name; 234ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn utd.icon = icon; 235ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn utd.packageName = defaultPackageName; 236a521d11796ffced26319e32184a40383f191e1aeAmith Yamasani sUidCache.put(uidString, utd); 237c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang if (mHandler != null) { 238c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mHandler.sendMessage( 239c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mHandler.obtainMessage(BatteryStatsHelper.MSG_UPDATE_NAME_ICON, this)); 240c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang } 241ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn } 242c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang} 243