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