12a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani/* 22a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * Copyright (C) 2009 The Android Open Source Project 32a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * 42a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 52a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * you may not use this file except in compliance with the License. 62a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * You may obtain a copy of the License at 72a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * 82a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 92a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * 102a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * Unless required by applicable law or agreed to in writing, software 112a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 122a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * See the License for the specific language governing permissions and 142a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * limitations under the License. 152a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani */ 162a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 172a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasanipackage com.android.settings.fuelgauge; 182a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 19c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tangimport android.app.Activity; 20a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasaniimport android.content.BroadcastReceiver; 217f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.content.Context; 22a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasaniimport android.content.Intent; 23a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasaniimport android.content.IntentFilter; 242a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasaniimport android.os.BatteryStats; 252a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasaniimport android.os.Bundle; 2678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.os.Handler; 2778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.os.Message; 282a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasaniimport android.os.Parcel; 297f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.preference.Preference; 302a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasaniimport android.preference.PreferenceActivity; 3159a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackbornimport android.preference.PreferenceFragment; 322a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasaniimport android.preference.PreferenceGroup; 337f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.preference.PreferenceScreen; 34b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasaniimport android.text.TextUtils; 357f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.view.Menu; 3659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackbornimport android.view.MenuInflater; 377f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.view.MenuItem; 382a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 39162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunneimport com.android.internal.os.PowerProfile; 40aeb57edaef1abdcdcd21eb443047386940ffb755Amith Yamasaniimport com.android.settings.HelpUtils; 41162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunneimport com.android.settings.R; 42162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunne 432a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasaniimport java.util.List; 442a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 452a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani/** 462a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * Displays a list of apps and subsystems that consume power, ordered by how much power was 472a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani * consumed since the last time it was unplugged. 482a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani */ 49c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tangpublic class PowerUsageSummary extends PreferenceFragment { 502a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 5178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani private static final boolean DEBUG = false; 522a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 532a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani private static final String TAG = "PowerUsageSummary"; 547f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani 55a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani private static final String KEY_APP_LIST = "app_list"; 56a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani private static final String KEY_BATTERY_STATUS = "battery_status"; 57a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani 587f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani private static final int MENU_STATS_TYPE = Menu.FIRST; 597f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani private static final int MENU_STATS_REFRESH = Menu.FIRST + 1; 60b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani private static final int MENU_HELP = Menu.FIRST + 2; 617f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani 622a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani private PreferenceGroup mAppListGroup; 63a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani private Preference mBatteryStatusPref; 642a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 654f0e5350fccd78bf881b938aaf0f484d135829a0Dianne Hackborn private int mStatsType = BatteryStats.STATS_SINCE_CHARGED; 662a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 672a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani private static final int MIN_POWER_THRESHOLD = 5; 682a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani private static final int MAX_ITEMS_TO_LIST = 10; 692a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 70c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang private BatteryStatsHelper mStatsHelper; 71a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani 72a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() { 73a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani 74a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani @Override 75a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani public void onReceive(Context context, Intent intent) { 76a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani String action = intent.getAction(); 77a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 78a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani String batteryLevel = com.android.settings.Utils.getBatteryPercentage(intent); 79a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani String batteryStatus = com.android.settings.Utils.getBatteryStatus(getResources(), 80a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani intent); 81a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani String batterySummary = context.getResources().getString( 82a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani R.string.power_usage_level_and_status, batteryLevel, batteryStatus); 83a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani mBatteryStatusPref.setTitle(batterySummary); 84c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mStatsHelper.clearStats(); 858f716f66cf3802877a0dcd0847a2181eca1431f2Amith Yamasani refreshStats(); 86a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani } 87a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani } 88a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani }; 89a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani 902a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani @Override 91c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang public void onAttach(Activity activity) { 92c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang super.onAttach(activity); 93c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mStatsHelper = new BatteryStatsHelper(activity, mHandler); 94c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang } 95c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang 96c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang @Override 9759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn public void onCreate(Bundle icicle) { 982a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani super.onCreate(icicle); 99c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mStatsHelper.create(icicle); 100cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn 1012a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani addPreferencesFromResource(R.xml.power_usage_summary); 102a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST); 103a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani mBatteryStatusPref = mAppListGroup.findPreference(KEY_BATTERY_STATUS); 1041aae305fa006ed8047017d52c4f60a9c7d810a93Amith Yamasani setHasOptionsMenu(true); 105cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn } 106cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn 107cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn @Override 10859a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn public void onResume() { 1092a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani super.onResume(); 110a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani getActivity().registerReceiver(mBatteryInfoReceiver, 111a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 1120422a3bf61c17851abd87a67a0de30e412459b5cAmith Yamasani refreshStats(); 1132a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani } 1142a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 1157f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani @Override 11659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn public void onPause() { 117c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mStatsHelper.pause(); 118c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mHandler.removeMessages(BatteryStatsHelper.MSG_UPDATE_NAME_ICON); 119a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani getActivity().unregisterReceiver(mBatteryInfoReceiver); 12078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani super.onPause(); 12178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani } 12278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani 12378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani @Override 12459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn public void onDestroy() { 12559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn super.onDestroy(); 126c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mStatsHelper.destroy(); 12759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn } 12859a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn 12959a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn @Override 1307f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 131cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn if (preference instanceof BatteryHistoryPreference) { 132cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn Parcel hist = Parcel.obtain(); 133c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mStatsHelper.getStats().writeToParcelWithoutUids(hist, 0); 134cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn byte[] histData = hist.marshall(); 13559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn Bundle args = new Bundle(); 13659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn args.putByteArray(BatteryHistoryDetail.EXTRA_STATS, histData); 13759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 13859a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn pa.startPreferencePanel(BatteryHistoryDetail.class.getName(), args, 13959a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn R.string.history_details_title, null, null, 0); 140cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn return super.onPreferenceTreeClick(preferenceScreen, preference); 141cbaf6ceb8e6b2d36a40589de6380ff93e75335dfDianne Hackborn } 1424f0e5350fccd78bf881b938aaf0f484d135829a0Dianne Hackborn if (!(preference instanceof PowerGaugePreference)) { 1434f0e5350fccd78bf881b938aaf0f484d135829a0Dianne Hackborn return false; 1444f0e5350fccd78bf881b938aaf0f484d135829a0Dianne Hackborn } 1457f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani PowerGaugePreference pgp = (PowerGaugePreference) preference; 1467f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani BatterySipper sipper = pgp.getInfo(); 147bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang mStatsHelper.startBatteryDetailPage((PreferenceActivity) getActivity(), sipper, true); 1487f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani return super.onPreferenceTreeClick(preferenceScreen, preference); 1497f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani } 1507f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani 1517f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani @Override 15259a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 15378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani if (DEBUG) { 15478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani menu.add(0, MENU_STATS_TYPE, 0, R.string.menu_stats_total) 15578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani .setIcon(com.android.internal.R.drawable.ic_menu_info_details) 15678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani .setAlphabeticShortcut('t'); 15778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani } 1581aae305fa006ed8047017d52c4f60a9c7d810a93Amith Yamasani MenuItem refresh = menu.add(0, MENU_STATS_REFRESH, 0, R.string.menu_stats_refresh) 1598472b1b60d7400a2a6dab8b54d1e1fd80659487fJustin Ho .setIcon(R.drawable.ic_menu_refresh_holo_dark) 1607f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani .setAlphabeticShortcut('r'); 161162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunne refresh.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 162162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunne MenuItem.SHOW_AS_ACTION_WITH_TEXT); 163b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani 164b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani String helpUrl; 165b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani if (!TextUtils.isEmpty(helpUrl = getResources().getString(R.string.help_url_battery))) { 166b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani final MenuItem help = menu.add(0, MENU_HELP, 0, R.string.help_label); 167aeb57edaef1abdcdcd21eb443047386940ffb755Amith Yamasani HelpUtils.prepareHelpMenuItem(getActivity(), help, helpUrl); 168b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani } 1697f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani } 1707f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani 1717f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani @Override 1727f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani public boolean onOptionsItemSelected(MenuItem item) { 1737f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani switch (item.getItemId()) { 1747f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani case MENU_STATS_TYPE: 1754f0e5350fccd78bf881b938aaf0f484d135829a0Dianne Hackborn if (mStatsType == BatteryStats.STATS_SINCE_CHARGED) { 1764f0e5350fccd78bf881b938aaf0f484d135829a0Dianne Hackborn mStatsType = BatteryStats.STATS_SINCE_UNPLUGGED; 1777f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani } else { 1784f0e5350fccd78bf881b938aaf0f484d135829a0Dianne Hackborn mStatsType = BatteryStats.STATS_SINCE_CHARGED; 1797f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani } 1800422a3bf61c17851abd87a67a0de30e412459b5cAmith Yamasani refreshStats(); 1817f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani return true; 1827f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani case MENU_STATS_REFRESH: 183c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang mStatsHelper.clearStats(); 1840422a3bf61c17851abd87a67a0de30e412459b5cAmith Yamasani refreshStats(); 1857f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani return true; 1867f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani default: 1877f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani return false; 1887f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani } 1897f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani } 1907f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani 191137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani private void addNotAvailableMessage() { 192137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani Preference notAvailable = new Preference(getActivity()); 193137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani notAvailable.setTitle(R.string.power_usage_not_available); 194137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani mAppListGroup.addPreference(notAvailable); 195137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani } 196137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani 1970422a3bf61c17851abd87a67a0de30e412459b5cAmith Yamasani private void refreshStats() { 1982a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani mAppListGroup.removeAll(); 1992a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani mAppListGroup.setOrderingAsAdded(false); 2002a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 201a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani mBatteryStatusPref.setOrder(-2); 202a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani mAppListGroup.addPreference(mBatteryStatusPref); 203c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang BatteryHistoryPreference hist = new BatteryHistoryPreference( 204c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang getActivity(), mStatsHelper.getStats()); 205ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn hist.setOrder(-1); 206ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn mAppListGroup.addPreference(hist); 207c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang 208c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang if (mStatsHelper.getPowerProfile().getAveragePower( 209c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang PowerProfile.POWER_SCREEN_FULL) < 10) { 210137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani addNotAvailableMessage(); 211137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani return; 212137588d60b0d8bb9612fa42f6d650751f540177bAmith Yamasani } 213ad7bfbd3469b0dfd42c6bc9d25b22c29d52fbdadLifu Tang mStatsHelper.refreshStats(false); 214c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang List<BatterySipper> usageList = mStatsHelper.getUsageList(); 215c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang for (BatterySipper sipper : usageList) { 2168fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani if (sipper.getSortValue() < MIN_POWER_THRESHOLD) continue; 217c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang final double percentOfTotal = 218c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang ((sipper.getSortValue() / mStatsHelper.getTotalPower()) * 100); 2198fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani if (percentOfTotal < 1) continue; 220c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang PowerGaugePreference pref = 221c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang new PowerGaugePreference(getActivity(), sipper.getIcon(), sipper); 222c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang final double percentOfMax = 223c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang (sipper.getSortValue() * 100) / mStatsHelper.getMaxPower(); 2248fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani sipper.percent = percentOfTotal; 2258fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani pref.setTitle(sipper.name); 2268fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani pref.setOrder(Integer.MAX_VALUE - (int) sipper.getSortValue()); // Invert the order 22728130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey pref.setPercent(percentOfMax, percentOfTotal); 2288fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani if (sipper.uidObj != null) { 2298fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani pref.setKey(Integer.toString(sipper.uidObj.getUid())); 23078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani } 2312a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani mAppListGroup.addPreference(pref); 232ea38e678537cf740b5f30c1d69c7a332e98cdd2cDianne Hackborn if (mAppListGroup.getPreferenceCount() > (MAX_ITEMS_TO_LIST+1)) break; 2332a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani } 2342a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani } 2352a2daf960c43a2c97b1c6da430138e08e9caa54fAmith Yamasani 23678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani Handler mHandler = new Handler() { 23778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani 23878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani @Override 23978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani public void handleMessage(Message msg) { 24078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani switch (msg.what) { 241c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang case BatteryStatsHelper.MSG_UPDATE_NAME_ICON: 24278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani BatterySipper bs = (BatterySipper) msg.obj; 243c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang PowerGaugePreference pgp = 24478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani (PowerGaugePreference) findPreference( 24578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani Integer.toString(bs.uidObj.getUid())); 24678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani if (pgp != null) { 24728130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey pgp.setIcon(bs.icon); 24878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani pgp.setTitle(bs.name); 24978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani } 25078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani break; 251c3e9ac937a4ba948d47cbb83f6999af34fd00b65Lifu Tang case BatteryStatsHelper.MSG_REPORT_FULLY_DRAWN: 2525334cf609f783218efd553466df4cdb4b1aadca8Amith Yamasani Activity activity = getActivity(); 2535334cf609f783218efd553466df4cdb4b1aadca8Amith Yamasani if (activity != null) { 2545334cf609f783218efd553466df4cdb4b1aadca8Amith Yamasani activity.reportFullyDrawn(); 2555334cf609f783218efd553466df4cdb4b1aadca8Amith Yamasani } 25615ab7758df616a27c28276ab97ddb2e2de6089f7Dianne Hackborn break; 25778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani } 25878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani super.handleMessage(msg); 25978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani } 26078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani }; 2611fd2958ad43433b774500e0cf7013d21013257adAmith Yamasani} 262