BatteryEntry.java revision 7c80af410b09fa14b6fdb5ecec14b6b96562de4c
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
197c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.Context;
207c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.ApplicationInfo;
217c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.PackageInfo;
227c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.PackageManager;
237c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.content.pm.UserInfo;
247c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.graphics.drawable.Drawable;
257c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.os.BatteryStats;
267c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.os.Handler;
277c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport android.os.UserManager;
287c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport com.android.internal.os.BatterySipper;
297c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport com.android.settings.R;
307c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport com.android.settings.users.UserUtils;
317c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
327c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport java.util.ArrayList;
337c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornimport java.util.HashMap;
347c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
357c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn/**
367c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * Wraps the power usage data of a BatterySipper with information about package name
377c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn * and icon image.
387c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn */
397c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackbornpublic class BatteryEntry {
407c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static final int MSG_UPDATE_NAME_ICON = 1;
417c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static final int MSG_REPORT_FULLY_DRAWN = 2;
427c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
437c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static final HashMap<String,UidToDetail> sUidCache = new HashMap<String,UidToDetail>();
447c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
457c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static final ArrayList<BatteryEntry> mRequestQueue = new ArrayList<BatteryEntry>();
467c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static Handler mHandler;
477c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
487c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static private class NameAndIconLoader extends Thread {
497c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        private boolean mAbort = false;
507c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
517c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        public NameAndIconLoader() {
527c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            super("BatteryUsage Icon Loader");
537c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
547c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
557c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        public void abort() {
567c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            mAbort = true;
577c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
587c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
597c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        @Override
607c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        public void run() {
617c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            while (true) {
627c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                BatteryEntry be;
637c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                synchronized (mRequestQueue) {
647c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (mRequestQueue.isEmpty() || mAbort) {
657c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        mHandler.sendEmptyMessage(MSG_REPORT_FULLY_DRAWN);
667c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        mRequestQueue.clear();
677c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        return;
687c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
697c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    be = mRequestQueue.remove(0);
707c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
717c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                be.loadNameAndIcon();
727c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
737c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
747c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
757c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
767c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    private static NameAndIconLoader mRequestThread;
777c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
787c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static void startRequestQueue() {
797c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (mHandler != null) {
807c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            synchronized (mRequestQueue) {
817c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (!mRequestQueue.isEmpty()) {
827c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (mRequestThread != null) {
837c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        mRequestThread.abort();
847c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
857c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestThread = new NameAndIconLoader();
867c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestThread.setPriority(Thread.MIN_PRIORITY);
877c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestThread.start();
887c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    mRequestQueue.notify();
897c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
907c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
917c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
927c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
937c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
947c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static void stopRequestQueue() {
957c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        synchronized (mRequestQueue) {
967c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            if (mRequestThread != null) {
977c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                mRequestThread.abort();
987c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                mRequestThread = null;
997c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                mHandler = null;
1007c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
1017c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1027c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1037c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1047c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public static void clearUidCache() {
1057c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        sUidCache.clear();
1067c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1077c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1087c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public final Context context;
1097c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public final BatterySipper sipper;
1107c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1117c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public String name;
1127c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public Drawable icon;
1137c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public int iconId; // For passing to the detail screen.
1147c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public String defaultPackageName;
1157c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1167c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    static class UidToDetail {
1177c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String name;
1187c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String packageName;
1197c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        Drawable icon;
1207c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1217c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1227c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public BatteryEntry(Context context, Handler handler, UserManager um, BatterySipper sipper) {
1237c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        mHandler = handler;
1247c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        this.context = context;
1257c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        this.sipper = sipper;
1267c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        switch (sipper.drainType) {
1277c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case IDLE:
1287c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_idle);
1297c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_phone_idle;
1307c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1317c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case CELL:
1327c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_cell);
1337c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_cell_standby;
1347c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1357c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case PHONE:
1367c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_phone);
1377c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_voice_calls;
1387c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1397c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case WIFI:
1407c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_wifi);
1417c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_wifi;
1427c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1437c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case BLUETOOTH:
1447c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_bluetooth);
1457c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_bluetooth;
1467c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1477c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case SCREEN:
1487c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_screen);
1497c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_settings_display;
1507c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1517c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case APP:
1527c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = sipper.packageWithHighestDrain;
1537c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1547c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case USER: {
1557c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                UserInfo info = um.getUserInfo(sipper.userId);
1567c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (info != null) {
1577c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    icon = UserUtils.getUserIcon(context, um, info, context.getResources());
1587c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    name = info != null ? info.name : null;
1597c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (name == null) {
1607c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        name = Integer.toString(info.id);
1617c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
1627c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    name = context.getResources().getString(
1637c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            R.string.running_process_item_user_label, name);
1647c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                } else {
1657c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    icon = null;
1667c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    name = context.getResources().getString(
1677c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            R.string.running_process_item_removed_user_label);
1687c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
1697c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            } break;
1707c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case UNACCOUNTED:
1717c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_unaccounted);
1727c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_power_system;
1737c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1747c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            case OVERCOUNTED:
1757c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.power_overcounted);
1767c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                iconId = R.drawable.ic_power_system;
1777c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                break;
1787c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1797c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (iconId > 0) {
1807c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            icon = context.getResources().getDrawable(iconId);
1817c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1827c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if ((name == null || iconId == 0) && this.sipper.uidObj != null) {
1837c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            getQuickNameIconForUid(this.sipper.uidObj);
1847c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
1857c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1867c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1877c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public Drawable getIcon() {
1887c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        return icon;
1897c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1907c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1917c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    /**
1927c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     * Gets the application name
1937c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     */
1947c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public String getLabel() {
1957c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        return name;
1967c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
1977c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
1987c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    void getQuickNameIconForUid(BatteryStats.Uid uidObj) {
1997c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final int uid = uidObj.getUid();
2007c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final String uidString = Integer.toString(uid);
2017c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (sUidCache.containsKey(uidString)) {
2027c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            UidToDetail utd = sUidCache.get(uidString);
2037c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            defaultPackageName = utd.packageName;
2047c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            name = utd.name;
2057c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            icon = utd.icon;
2067c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2077c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2087c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        PackageManager pm = context.getPackageManager();
2097c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String[] packages = pm.getPackagesForUid(uid);
2107c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        icon = pm.getDefaultActivityIcon();
2117c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (packages == null) {
2127c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            //name = Integer.toString(uid);
2137c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            if (uid == 0) {
2147c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.process_kernel_label);
2157c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            } else if ("mediaserver".equals(name)) {
2167c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                name = context.getResources().getString(R.string.process_mediaserver_label);
2177c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
2187c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            iconId = R.drawable.ic_power_system;
2197c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            icon = context.getResources().getDrawable(iconId);
2207c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2217c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        } else {
2227c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            //name = packages[0];
2237c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2247c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (mHandler != null) {
2257c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            synchronized (mRequestQueue) {
2267c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                mRequestQueue.add(this);
2277c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
2287c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2297c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
2307c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2317c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    /**
2327c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     * Loads the app label and icon image and stores into the cache.
2337c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn     */
2347c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    public void loadNameAndIcon() {
2357c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        // Bail out if the current sipper is not an App sipper.
2367c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (sipper.uidObj == null) {
2377c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2387c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2397c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        PackageManager pm = context.getPackageManager();
2407c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final int uid = sipper.uidObj.getUid();
2417c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
2427c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        sipper.mPackages = pm.getPackagesForUid(uid);
2437c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (sipper.mPackages == null) {
2447c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            name = Integer.toString(uid);
2457c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            return;
2467c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2477c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2487c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        String[] packageLabels = new String[sipper.mPackages.length];
2497c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        System.arraycopy(sipper.mPackages, 0, packageLabels, 0, sipper.mPackages.length);
2507c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2517c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        int preferredIndex = -1;
2527c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        // Convert package names to user-facing labels where possible
2537c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        for (int i = 0; i < packageLabels.length; i++) {
2547c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            // Check if package matches preferred package
2557c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            if (packageLabels[i].equals(name)) preferredIndex = i;
2567c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            try {
2577c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                ApplicationInfo ai = pm.getApplicationInfo(packageLabels[i], 0);
2587c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                CharSequence label = ai.loadLabel(pm);
2597c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (label != null) {
2607c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    packageLabels[i] = label.toString();
2617c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
2627c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                if (ai.icon != 0) {
2637c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    defaultPackageName = sipper.mPackages[i];
2647c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    icon = ai.loadIcon(pm);
2657c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    break;
2667c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
2677c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            } catch (PackageManager.NameNotFoundException e) {
2687c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
2697c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2707c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (icon == null) icon = defaultActivityIcon;
2717c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn
2727c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (packageLabels.length == 1) {
2737c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            name = packageLabels[0];
2747c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        } else {
2757c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            // Look for an official name for this UID.
2767c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            for (String pkgName : sipper.mPackages) {
2777c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                try {
2787c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    final PackageInfo pi = pm.getPackageInfo(pkgName, 0);
2797c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    if (pi.sharedUserLabel != 0) {
2807c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        final CharSequence nm = pm.getText(pkgName,
2817c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                                pi.sharedUserLabel, pi.applicationInfo);
2827c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        if (nm != null) {
2837c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            name = nm.toString();
2847c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            if (pi.applicationInfo.icon != 0) {
2857c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                                defaultPackageName = pkgName;
2867c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                                icon = pi.applicationInfo.loadIcon(pm);
2877c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            }
2887c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                            break;
2897c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                        }
2907c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                    }
2917c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
2927c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn                }
2937c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            }
2947c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
2957c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        final String uidString = Integer.toString(sipper.uidObj.getUid());
2967c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        UidToDetail utd = new UidToDetail();
2977c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        utd.name = name;
2987c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        utd.icon = icon;
2997c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        utd.packageName = defaultPackageName;
3007c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        sUidCache.put(uidString, utd);
3017c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        if (mHandler != null) {
3027c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn            mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_NAME_ICON, this));
3037c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn        }
3047c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn    }
3057c80af410b09fa14b6fdb5ecec14b6b96562de4cDianne Hackborn}
306