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