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