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