17c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn/*
27c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * Copyright (C) 2014 The Android Open Source Project
37c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn *
47c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
57c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * you may not use this file except in compliance with the License.
67c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * You may obtain a copy of the License at
77c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn *
87c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
97c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn *
107c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * Unless required by applicable law or agreed to in writing, software
117c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
127c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * See the License for the specific language governing permissions and
147c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * limitations under the License.
157c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn */
167c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
177c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornpackage com.android.settings.fuelgauge;
187c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
193aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Banimport android.app.AppGlobals;
207c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.Context;
217c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.ApplicationInfo;
223aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Banimport android.content.pm.IPackageManager;
237c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.PackageInfo;
247c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.PackageManager;
257c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.UserInfo;
267c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.graphics.drawable.Drawable;
277c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.os.BatteryStats;
287c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.os.Handler;
293aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Banimport android.os.RemoteException;
303aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Banimport android.os.UserHandle;
317c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.os.UserManager;
323aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Banimport android.util.Log;
3395b86a5488a27d95bda8b6db1f608d6ce55dae8aAlexandra Gherghina
347c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport com.android.internal.os.BatterySipper;
357c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport com.android.settings.R;
3695b86a5488a27d95bda8b6db1f608d6ce55dae8aAlexandra Gherghinaimport com.android.settings.Utils;
377c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
387c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport java.util.ArrayList;
397c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport java.util.HashMap;
407c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
417c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn/**
427c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * Wraps the power usage data of a BatterySipper with information about package name
437c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * and icon image.
447c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn */
457c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornpublic class BatteryEntry {
467c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static final int MSG_UPDATE_NAME_ICON = 1;
477c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static final int MSG_REPORT_FULLY_DRAWN = 2;
487c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
497c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static final HashMap<String,UidToDetail> sUidCache = new HashMap<String,UidToDetail>();
507c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
517c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static final ArrayList<BatteryEntry> mRequestQueue = new ArrayList<BatteryEntry>();
52002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio    static Handler sHandler;
537c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
547c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static private class NameAndIconLoader extends Thread {
557c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        private boolean mAbort = false;
567c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
577c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        public NameAndIconLoader() {
587c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            super("BatteryUsage Icon Loader");
597c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
607c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
617c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        public void abort() {
627c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            mAbort = true;
637c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
647c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
657c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        @Override
667c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        public void run() {
677c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            while (true) {
687c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                BatteryEntry be;
697c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                synchronized (mRequestQueue) {
707c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (mRequestQueue.isEmpty() || mAbort) {
71002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio                        if (sHandler != null) {
72002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio                            sHandler.sendEmptyMessage(MSG_REPORT_FULLY_DRAWN);
73002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio                        }
747c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        mRequestQueue.clear();
757c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        return;
767c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
777c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    be = mRequestQueue.remove(0);
787c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
797c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                be.loadNameAndIcon();
807c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
817c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
827c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
837c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
847c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    private static NameAndIconLoader mRequestThread;
857c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
867c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static void startRequestQueue() {
87002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio        if (sHandler != null) {
887c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            synchronized (mRequestQueue) {
897c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (!mRequestQueue.isEmpty()) {
907c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (mRequestThread != null) {
917c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        mRequestThread.abort();
927c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
937c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestThread = new NameAndIconLoader();
947c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestThread.setPriority(Thread.MIN_PRIORITY);
957c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestThread.start();
967c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestQueue.notify();
977c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
987c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
997c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1007c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1017c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1027c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static void stopRequestQueue() {
1037c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        synchronized (mRequestQueue) {
1047c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            if (mRequestThread != null) {
1057c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                mRequestThread.abort();
1067c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                mRequestThread = null;
107002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio                sHandler = null;
1087c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
1097c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1107c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1117c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1127c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static void clearUidCache() {
1137c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        sUidCache.clear();
1147c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1157c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1167c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public final Context context;
1177c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public final BatterySipper sipper;
1187c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1197c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public String name;
1207c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public Drawable icon;
1217c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public int iconId; // For passing to the detail screen.
1227c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public String defaultPackageName;
1237c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1247c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static class UidToDetail {
1257c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String name;
1267c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String packageName;
1277c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        Drawable icon;
1287c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1297c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1307c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public BatteryEntry(Context context, Handler handler, UserManager um, BatterySipper sipper) {
131002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio        sHandler = handler;
1327c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        this.context = context;
1337c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        this.sipper = sipper;
1347c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        switch (sipper.drainType) {
1357c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case IDLE:
1367c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_idle);
1377c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_phone_idle;
1387c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1397c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case CELL:
1407c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_cell);
1417c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_cell_standby;
1427c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1437c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case PHONE:
1447c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_phone);
1457c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_voice_calls;
1467c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1477c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case WIFI:
1487c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_wifi);
1497c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_wifi;
1507c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1517c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case BLUETOOTH:
1527c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_bluetooth);
1537c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_bluetooth;
1547c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1557c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case SCREEN:
1567c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_screen);
1577c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_display;
1587c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1596fd48e224f89e4d4e154dcf2e494c201293cc167Dianne Hackborn            case FLASHLIGHT:
1606fd48e224f89e4d4e154dcf2e494c201293cc167Dianne Hackborn                name = context.getResources().getString(R.string.power_flashlight);
1616fd48e224f89e4d4e154dcf2e494c201293cc167Dianne Hackborn                iconId = R.drawable.ic_settings_display;
1626fd48e224f89e4d4e154dcf2e494c201293cc167Dianne Hackborn                break;
1637c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case APP:
1647c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = sipper.packageWithHighestDrain;
1657c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1667c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case USER: {
1677c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                UserInfo info = um.getUserInfo(sipper.userId);
1687c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (info != null) {
16995b86a5488a27d95bda8b6db1f608d6ce55dae8aAlexandra Gherghina                    icon = Utils.getUserIcon(context, um, info);
1707c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    name = info != null ? info.name : null;
1717c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (name == null) {
1727c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        name = Integer.toString(info.id);
1737c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
1747c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    name = context.getResources().getString(
1757c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            R.string.running_process_item_user_label, name);
1767c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                } else {
1777c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    icon = null;
1787c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    name = context.getResources().getString(
1797c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            R.string.running_process_item_removed_user_label);
1807c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
1817c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            } break;
1827c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case UNACCOUNTED:
1837c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_unaccounted);
1847c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_power_system;
1857c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1867c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case OVERCOUNTED:
1877c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_overcounted);
1887c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_power_system;
1897c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1907c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1917c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (iconId > 0) {
1927c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            icon = context.getResources().getDrawable(iconId);
1937c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1947c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if ((name == null || iconId == 0) && this.sipper.uidObj != null) {
1957c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            getQuickNameIconForUid(this.sipper.uidObj);
1967c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1977c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1987c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1997c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public Drawable getIcon() {
2007c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        return icon;
2017c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
2027c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2037c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    /**
2047c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     * Gets the application name
2057c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     */
2067c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public String getLabel() {
2077c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        return name;
2087c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
2097c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2107c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    void getQuickNameIconForUid(BatteryStats.Uid uidObj) {
2117c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final int uid = uidObj.getUid();
2127c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final String uidString = Integer.toString(uid);
2137c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (sUidCache.containsKey(uidString)) {
2147c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            UidToDetail utd = sUidCache.get(uidString);
2157c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            defaultPackageName = utd.packageName;
2167c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            name = utd.name;
2177c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            icon = utd.icon;
2187c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2197c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2207c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        PackageManager pm = context.getPackageManager();
2217c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String[] packages = pm.getPackagesForUid(uid);
2227c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        icon = pm.getDefaultActivityIcon();
2237c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (packages == null) {
2247c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            //name = Integer.toString(uid);
2257c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            if (uid == 0) {
2267c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.process_kernel_label);
2277c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            } else if ("mediaserver".equals(name)) {
2287c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.process_mediaserver_label);
2297c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
2307c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            iconId = R.drawable.ic_power_system;
2317c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            icon = context.getResources().getDrawable(iconId);
2327c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2337c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        } else {
2347c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            //name = packages[0];
2357c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
236002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio        if (sHandler != null) {
2377c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            synchronized (mRequestQueue) {
2387c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                mRequestQueue.add(this);
2397c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
2407c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2417c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
2427c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2437c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    /**
2447c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     * Loads the app label and icon image and stores into the cache.
2457c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     */
2467c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public void loadNameAndIcon() {
2477c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        // Bail out if the current sipper is not an App sipper.
2487c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (sipper.uidObj == null) {
2497c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2507c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2517c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        PackageManager pm = context.getPackageManager();
2527c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final int uid = sipper.uidObj.getUid();
2537c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
2547c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        sipper.mPackages = pm.getPackagesForUid(uid);
2557c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (sipper.mPackages == null) {
2567c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            name = Integer.toString(uid);
2577c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2587c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2597c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2607c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String[] packageLabels = new String[sipper.mPackages.length];
2617c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        System.arraycopy(sipper.mPackages, 0, packageLabels, 0, sipper.mPackages.length);
2627c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2637c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        // Convert package names to user-facing labels where possible
2643aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban        IPackageManager ipm = AppGlobals.getPackageManager();
2653aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban        final int userId = UserHandle.getUserId(uid);
2667c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        for (int i = 0; i < packageLabels.length; i++) {
2677c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            try {
2683aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                final ApplicationInfo ai = ipm.getApplicationInfo(packageLabels[i],
2693aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                        0 /* no flags */, userId);
2703aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                if (ai == null) {
2713aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                    Log.d(PowerUsageSummary.TAG, "Retrieving null app info for package "
2723aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                            + packageLabels[i] + ", user " + userId);
2733aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                    continue;
2743aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                }
2757c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                CharSequence label = ai.loadLabel(pm);
2767c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (label != null) {
2777c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    packageLabels[i] = label.toString();
2787c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
2797c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (ai.icon != 0) {
2807c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    defaultPackageName = sipper.mPackages[i];
2817c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    icon = ai.loadIcon(pm);
2827c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    break;
2837c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
2843aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban            } catch (RemoteException e) {
2853aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                Log.d(PowerUsageSummary.TAG, "Error while retrieving app info for package "
2863aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                        + packageLabels[i] + ", user " + userId, e);
2877c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
2887c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2893aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban        if (icon == null) {
2903aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban            icon = defaultActivityIcon;
2913aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban        }
2927c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2937c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (packageLabels.length == 1) {
2947c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            name = packageLabels[0];
2957c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        } else {
2967c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            // Look for an official name for this UID.
2977c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            for (String pkgName : sipper.mPackages) {
2987c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                try {
2993aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                    final PackageInfo pi = ipm.getPackageInfo(pkgName, 0 /* no flags */, userId);
3003aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                    if (pi == null) {
3013aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                        Log.d(PowerUsageSummary.TAG, "Retrieving null package info for package "
3023aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                                + pkgName + ", user " + userId);
3033aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                        continue;
3043aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                    }
3057c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (pi.sharedUserLabel != 0) {
3067c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        final CharSequence nm = pm.getText(pkgName,
3077c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                                pi.sharedUserLabel, pi.applicationInfo);
3087c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        if (nm != null) {
3097c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            name = nm.toString();
3107c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            if (pi.applicationInfo.icon != 0) {
3117c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                                defaultPackageName = pkgName;
3127c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                                icon = pi.applicationInfo.loadIcon(pm);
3137c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            }
3147c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            break;
3157c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        }
3167c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
3173aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                } catch (RemoteException e) {
3183aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                    Log.d(PowerUsageSummary.TAG, "Error while retrieving package info for package "
3193aaf0eb457639b52228143b84d9624bf73d862eaZoltan Szatmary-Ban                            + pkgName + ", user " + userId, e);
3207c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
3217c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
3227c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
3237c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final String uidString = Integer.toString(sipper.uidObj.getUid());
3247c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        UidToDetail utd = new UidToDetail();
3257c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        utd.name = name;
3267c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        utd.icon = icon;
3277c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        utd.packageName = defaultPackageName;
3287c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        sUidCache.put(uidString, utd);
329002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio        if (sHandler != null) {
330002b29fafc327afd86109e59c27c4a5ddd842492Fabrice Di Meglio            sHandler.sendMessage(sHandler.obtainMessage(MSG_UPDATE_NAME_ICON, this));
3317c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
3327c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
3337c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn}
334