17f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani/*
27f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * Copyright (C) 2009 The Android Open Source Project
37f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani *
47f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
57f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * you may not use this file except in compliance with the License.
67f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * You may obtain a copy of the License at
77f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani *
87f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
97f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani *
107f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * Unless required by applicable law or agreed to in writing, software
117f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
127f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * See the License for the specific language governing permissions and
147f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani * limitations under the License.
157f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani */
167f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
177f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasanipackage com.android.settings.fuelgauge;
187f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
1997d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport static com.android.settings.Utils.prepareCustomPreferencesList;
2097d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
217f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.app.Activity;
2278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.app.ActivityManager;
23cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.app.ApplicationErrorReport;
2459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackbornimport android.app.Fragment;
255c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackbornimport android.app.admin.DevicePolicyManager;
26cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver;
27cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.ComponentName;
2878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.content.Context;
297f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.content.Intent;
3078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.content.pm.ApplicationInfo;
3178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.content.pm.PackageInfo;
3278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.content.pm.PackageManager;
3378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.content.pm.PackageManager.NameNotFoundException;
348fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasaniimport android.content.res.Resources;
3578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.graphics.drawable.Drawable;
36cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.net.Uri;
377f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.os.Bundle;
38cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.os.Process;
39e63cc20570e7229bc72040d01b70349d6ae460f6Amith Yamasaniimport android.os.UserHandle;
4059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackbornimport android.preference.PreferenceActivity;
4178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.provider.Settings;
420f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasaniimport android.text.TextUtils;
43f707491cfb5d52d11b18335348ed49a19ad2ab17Jeff Sharkeyimport android.text.format.Formatter;
447f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.view.LayoutInflater;
4578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.view.View;
467f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.view.ViewGroup;
4778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasaniimport android.widget.Button;
480f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasaniimport android.widget.ImageView;
4928130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkeyimport android.widget.ProgressBar;
507f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport android.widget.TextView;
51c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn
52c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackbornimport com.android.settings.DisplaySettings;
537f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasaniimport com.android.settings.R;
54c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackbornimport com.android.settings.WirelessSettings;
55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.applications.InstalledAppDetails;
56c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackbornimport com.android.settings.bluetooth.BluetoothSettings;
5783ab7c932e59fd23799f5db723e80d411918a9a5Lifu Tangimport com.android.settings.location.LocationSettings;
58c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackbornimport com.android.settings.wifi.WifiSettings;
597f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
6059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackbornpublic class PowerUsageDetail extends Fragment implements Button.OnClickListener {
6178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
6278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    enum DrainType {
6378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        IDLE,
6478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        CELL,
6578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        PHONE,
6678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        WIFI,
6778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        BLUETOOTH,
6878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        SCREEN,
6952e56a24904389ca8f7e67e8a883f353b887a4afDianne Hackborn        APP,
7052e56a24904389ca8f7e67e8a883f353b887a4afDianne Hackborn        USER
7178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    }
7278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
730f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    // Note: Must match the sequence of the DrainType
740f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    private static int[] sDrainTypeDesciptions = new int[] {
750f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        R.string.battery_desc_standby,
760f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        R.string.battery_desc_radio,
770f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        R.string.battery_desc_voice,
780f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        R.string.battery_desc_wifi,
790f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        R.string.battery_desc_bluetooth,
800f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        R.string.battery_desc_display,
8152e56a24904389ca8f7e67e8a883f353b887a4afDianne Hackborn        R.string.battery_desc_apps,
8252e56a24904389ca8f7e67e8a883f353b887a4afDianne Hackborn        R.string.battery_desc_users,
830f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    };
848fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani
8578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    public static final int ACTION_DISPLAY_SETTINGS = 1;
8678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    public static final int ACTION_WIFI_SETTINGS = 2;
8778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    public static final int ACTION_BLUETOOTH_SETTINGS = 3;
880422a3bf61c17851abd87a67a0de30e412459b5cAmith Yamasani    public static final int ACTION_WIRELESS_SETTINGS = 4;
898fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    public static final int ACTION_APP_DETAILS = 5;
90c9575c489bfbae848e3e2d2a9e35f630f2118c55Gilles Debunne    public static final int ACTION_LOCATION_SETTINGS = 6;
91cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    public static final int ACTION_FORCE_STOP = 7;
92cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    public static final int ACTION_REPORT = 8;
937f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
947f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    public static final int USAGE_SINCE_UNPLUGGED = 1;
957f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    public static final int USAGE_SINCE_RESET = 2;
967f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
977f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    public static final String EXTRA_TITLE = "title";
987f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    public static final String EXTRA_PERCENT = "percent";
990f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    public static final String EXTRA_GAUGE = "gauge";
10078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    public static final String EXTRA_UID = "uid";
1017f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    public static final String EXTRA_USAGE_SINCE = "since";
1027f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    public static final String EXTRA_USAGE_DURATION = "duration";
103cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    public static final String EXTRA_REPORT_DETAILS = "report_details";
104cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    public static final String EXTRA_REPORT_CHECKIN_DETAILS = "report_checkin_details";
1050f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    public static final String EXTRA_DETAIL_TYPES = "types"; // Array of usage types (cpu, gps, etc)
1060f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    public static final String EXTRA_DETAIL_VALUES = "values"; // Array of doubles
1070f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    public static final String EXTRA_DRAIN_TYPE = "drainType"; // DrainType
1080f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    public static final String EXTRA_ICON_PACKAGE = "iconPackage"; // String
1098fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    public static final String EXTRA_NO_COVERAGE = "noCoverage";
1100f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    public static final String EXTRA_ICON_ID = "iconId"; // Int
111bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang    public static final String EXTRA_SHOW_LOCATION_BUTTON = "showLocationButton";  // Boolean
1127f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
1135c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn    private PackageManager mPm;
1145c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn    private DevicePolicyManager mDpm;
1157f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private String mTitle;
1167f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private int mUsageSince;
1177f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private int[] mTypes;
11878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private int mUid;
1197f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private double[] mValues;
12059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    private View mRootView;
1217f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private TextView mTitleView;
122cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private ViewGroup mTwoButtonsPanel;
123cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private Button mForceStopButton;
124cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private Button mReportButton;
1257f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private ViewGroup mDetailsParent;
1268fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    private ViewGroup mControlsParent;
1277f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private long mStartTime;
12878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private DrainType mDrainType;
1290f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    private Drawable mAppIcon;
1308fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    private double mNoCoverage; // Percentage of time that there was no coverage
1318fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani
1328fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    private boolean mUsesGps;
133bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang    private boolean mShowLocationButton;
1347f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
1357f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private static final String TAG = "PowerUsageDetail";
13678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private String[] mPackages;
1377f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
138cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    ApplicationInfo mApp;
139cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    ComponentName mInstaller;
140bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang
1417f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    @Override
14259a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    public void onCreate(Bundle icicle) {
1437f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani        super.onCreate(icicle);
1445c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mPm = getActivity().getPackageManager();
1455c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
14659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    }
14759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn
14859a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    @Override
14997d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey    public View onCreateView(
15097d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
15197d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        final View view = inflater.inflate(R.layout.power_usage_details, container, false);
15297d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        prepareCustomPreferencesList(container, view, view, false);
15397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
15497d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        mRootView = view;
1557f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani        createDetails();
15659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        return view;
1577f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    }
1587f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
1597f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    @Override
16059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    public void onResume() {
1617f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani        super.onResume();
1627f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani        mStartTime = android.os.Process.getElapsedCpuTime();
163cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
1647f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    }
1657f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
1667f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    @Override
16759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    public void onPause() {
1687f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani        super.onPause();
1697f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    }
1707f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
1717f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    private void createDetails() {
17259a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        final Bundle args = getArguments();
17359a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mTitle = args.getString(EXTRA_TITLE);
17459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        final int percentage = args.getInt(EXTRA_PERCENT, 1);
17559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        final int gaugeValue = args.getInt(EXTRA_GAUGE, 1);
17659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mUsageSince = args.getInt(EXTRA_USAGE_SINCE, USAGE_SINCE_UNPLUGGED);
17759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mUid = args.getInt(EXTRA_UID, 0);
17859a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mDrainType = (DrainType) args.getSerializable(EXTRA_DRAIN_TYPE);
17959a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mNoCoverage = args.getDouble(EXTRA_NO_COVERAGE, 0);
18059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        String iconPackage = args.getString(EXTRA_ICON_PACKAGE);
18159a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        int iconId = args.getInt(EXTRA_ICON_ID, 0);
182bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang        mShowLocationButton = args.getBoolean(EXTRA_SHOW_LOCATION_BUTTON);
1830f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        if (!TextUtils.isEmpty(iconPackage)) {
1840f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani            try {
18559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn                final PackageManager pm = getActivity().getPackageManager();
1860f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani                ApplicationInfo ai = pm.getPackageInfo(iconPackage, 0).applicationInfo;
1870f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani                if (ai != null) {
1880f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani                    mAppIcon = ai.loadIcon(pm);
1890f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani                }
1900f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani            } catch (NameNotFoundException nnfe) {
1910f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani                // Use default icon
1920f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani            }
1930f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        } else if (iconId != 0) {
19459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn            mAppIcon = getActivity().getResources().getDrawable(iconId);
1950f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        }
1960f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        if (mAppIcon == null) {
19759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn            mAppIcon = getActivity().getPackageManager().getDefaultActivityIcon();
1980f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        }
1997f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
2000f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        // Set the description
20128130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        final TextView summary = (TextView) mRootView.findViewById(android.R.id.summary);
20228130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        summary.setText(getDescriptionForDrainType());
20328130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        summary.setVisibility(View.VISIBLE);
20428130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey
20559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mTypes = args.getIntArray(EXTRA_DETAIL_TYPES);
20659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mValues = args.getDoubleArray(EXTRA_DETAIL_VALUES);
2077f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani
20828130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        mTitleView = (TextView) mRootView.findViewById(android.R.id.title);
2097f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani        mTitleView.setText(mTitle);
21028130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey
21128130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        final TextView text1 = (TextView)mRootView.findViewById(android.R.id.text1);
21228130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        text1.setText(getString(R.string.percentage, percentage));
2130f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani
21459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mTwoButtonsPanel = (ViewGroup)mRootView.findViewById(R.id.two_buttons_panel);
21559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mForceStopButton = (Button)mRootView.findViewById(R.id.left_button);
21659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mReportButton = (Button)mRootView.findViewById(R.id.right_button);
217cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        mForceStopButton.setEnabled(false);
21828130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey
21928130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        final ProgressBar progress = (ProgressBar) mRootView.findViewById(android.R.id.progress);
22028130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        progress.setProgress(gaugeValue);
22128130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey
22228130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        final ImageView icon = (ImageView) mRootView.findViewById(android.R.id.icon);
22328130d96385d7d7b17992b45fb5d124836d85880Jeff Sharkey        icon.setImageDrawable(mAppIcon);
2248fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani
22559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mDetailsParent = (ViewGroup)mRootView.findViewById(R.id.details);
22659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        mControlsParent = (ViewGroup)mRootView.findViewById(R.id.controls);
22778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
2288fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        fillDetailsSection();
22978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        fillPackagesSection(mUid);
23078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        fillControlsSection(mUid);
231cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
232cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        if (mUid >= Process.FIRST_APPLICATION_UID) {
233cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setText(R.string.force_stop);
234cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setTag(ACTION_FORCE_STOP);
235cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setOnClickListener(this);
236cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mReportButton.setText(com.android.internal.R.string.report);
237cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mReportButton.setTag(ACTION_REPORT);
238cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mReportButton.setOnClickListener(this);
239cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
240cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            // check if error reporting is enabled in secure settings
2415246e7f76d5fe62f7ffd99e889d90116b37b7f35Jeff Sharkey            int enabled = Settings.Global.getInt(getActivity().getContentResolver(),
2425246e7f76d5fe62f7ffd99e889d90116b37b7f35Jeff Sharkey                    Settings.Global.SEND_ACTION_APP_ERROR, 0);
243cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            if (enabled != 0) {
244cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                if (mPackages != null && mPackages.length > 0) {
245cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                    try {
24659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn                        mApp = getActivity().getPackageManager().getApplicationInfo(
24759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn                                mPackages[0], 0);
248cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                        mInstaller = ApplicationErrorReport.getErrorReportReceiver(
24959a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn                                getActivity(), mPackages[0], mApp.flags);
250cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                    } catch (NameNotFoundException e) {
251cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                    }
252cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                }
253cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                mReportButton.setEnabled(mInstaller != null);
254cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            } else {
255cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                mTwoButtonsPanel.setVisibility(View.GONE);
256cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            }
257cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        } else {
258cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mTwoButtonsPanel.setVisibility(View.GONE);
259cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
26078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    }
26178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
26278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    public void onClick(View v) {
2638fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        doAction((Integer) v.getTag());
26478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    }
26578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
26659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    // utility method used to start sub activity
26759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    private void startApplicationDetailsActivity() {
26859a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        // start new fragment to display extended information
26959a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        Bundle args = new Bundle();
27059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackages[0]);
27159a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn
27259a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
27359a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        pa.startPreferencePanel(InstalledAppDetails.class.getName(), args,
27459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn                R.string.application_info_label, null, null, 0);
27559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn    }
27659a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn
27778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private void doAction(int action) {
278c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn        PreferenceActivity pa = (PreferenceActivity)getActivity();
27978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        switch (action) {
28078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            case ACTION_DISPLAY_SETTINGS:
281c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                pa.startPreferencePanel(DisplaySettings.class.getName(), null,
282c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                        R.string.display_settings_title, null, null, 0);
28378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                break;
28478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            case ACTION_WIFI_SETTINGS:
285c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                pa.startPreferencePanel(WifiSettings.class.getName(), null,
286c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                        R.string.wifi_settings, null, null, 0);
28778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                break;
28878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            case ACTION_BLUETOOTH_SETTINGS:
289c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                pa.startPreferencePanel(BluetoothSettings.class.getName(), null,
290c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                        R.string.bluetooth_settings, null, null, 0);
2918fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                break;
2928fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            case ACTION_WIRELESS_SETTINGS:
293c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                pa.startPreferencePanel(WirelessSettings.class.getName(), null,
294c05dedf9bee2445b6a35e7ca2f2d67f9b570bfaaDianne Hackborn                        R.string.radio_controls_title, null, null, 0);
29578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                break;
2960422a3bf61c17851abd87a67a0de30e412459b5cAmith Yamasani            case ACTION_APP_DETAILS:
29759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn                startApplicationDetailsActivity();
29878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                break;
299c9575c489bfbae848e3e2d2a9e35f630f2118c55Gilles Debunne            case ACTION_LOCATION_SETTINGS:
300c9575c489bfbae848e3e2d2a9e35f630f2118c55Gilles Debunne                pa.startPreferencePanel(LocationSettings.class.getName(), null,
301c9575c489bfbae848e3e2d2a9e35f630f2118c55Gilles Debunne                        R.string.location_settings_title, null, null, 0);
3028fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                break;
303cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            case ACTION_FORCE_STOP:
304cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                killProcesses();
305cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                break;
306cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            case ACTION_REPORT:
307cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                reportBatteryUse();
308cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                break;
3098fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        }
3108fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    }
3118fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani
3128fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    private void fillDetailsSection() {
31359a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        LayoutInflater inflater = getActivity().getLayoutInflater();
3148fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        if (mTypes != null && mValues != null) {
3158fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            for (int i = 0; i < mTypes.length; i++) {
3168fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                // Only add an item if the time is greater than zero
3178fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                if (mValues[i] <= 0) continue;
3188fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                final String label = getString(mTypes[i]);
3198fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                String value = null;
3208fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                switch (mTypes[i]) {
3218fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    case R.string.usage_type_data_recv:
3228fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    case R.string.usage_type_data_send:
323133581e267f513d00a8e50a80fded16535f2821dJeff Sharkey                    case R.string.usage_type_data_wifi_recv:
324133581e267f513d00a8e50a80fded16535f2821dJeff Sharkey                    case R.string.usage_type_data_wifi_send:
325f707491cfb5d52d11b18335348ed49a19ad2ab17Jeff Sharkey                        final long bytes = (long) (mValues[i]);
326f707491cfb5d52d11b18335348ed49a19ad2ab17Jeff Sharkey                        value = Formatter.formatFileSize(getActivity(), bytes);
3278fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        break;
3288fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    case R.string.usage_type_no_coverage:
329f707491cfb5d52d11b18335348ed49a19ad2ab17Jeff Sharkey                        final int percentage = (int) Math.floor(mValues[i]);
330f707491cfb5d52d11b18335348ed49a19ad2ab17Jeff Sharkey                        value = getActivity().getString(R.string.percentage, percentage);
3318fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        break;
3328fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    case R.string.usage_type_gps:
3338fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        mUsesGps = true;
3348fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        // Fall through
3358fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    default:
33649759af6b06b884d3a1af9dbb120370893744b94Dianne Hackborn                        value = Utils.formatElapsedTime(getActivity(), mValues[i], true);
3378fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                }
3388fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_detail_item_text,
3398fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        null);
3408fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                mDetailsParent.addView(item);
3418fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                TextView labelView = (TextView) item.findViewById(R.id.label);
3428fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                TextView valueView = (TextView) item.findViewById(R.id.value);
3438fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                labelView.setText(label);
3448fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                valueView.setText(value);
3458fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            }
34678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
34778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    }
34878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
34978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private void fillControlsSection(int uid) {
35059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        PackageManager pm = getActivity().getPackageManager();
3510f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        String[] packages = pm.getPackagesForUid(uid);
35278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        PackageInfo pi = null;
35378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        try {
35478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            pi = packages != null ? pm.getPackageInfo(packages[0], 0) : null;
35578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        } catch (NameNotFoundException nnfe) { /* Nothing */ }
35678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        ApplicationInfo ai = pi != null? pi.applicationInfo : null;
35778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
3588fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        boolean removeHeader = true;
3598fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        switch (mDrainType) {
3608fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            case APP:
3615d4e69a52703f552ced4d91fcc24455aeaf9916aLifu Tang                // If it is a Java application and only one package is associated with the Uid
3625d4e69a52703f552ced4d91fcc24455aeaf9916aLifu Tang                if (packages != null && packages.length == 1) {
3638fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    addControl(R.string.battery_action_app_details,
3648fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                            R.string.battery_sugg_apps_info, ACTION_APP_DETAILS);
3658fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    removeHeader = false;
3668fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    // If the application has a settings screen, jump to  that
3678fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    // TODO:
3688fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                }
369bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang                // If power usage detail page is launched from location page, suppress "Location"
370bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang                // button to prevent circular loops.
371bfa96c3b10f53a969406755eed36ba98fc1de549Lifu Tang                if (mUsesGps && mShowLocationButton) {
372c9575c489bfbae848e3e2d2a9e35f630f2118c55Gilles Debunne                    addControl(R.string.location_settings_title,
373c9575c489bfbae848e3e2d2a9e35f630f2118c55Gilles Debunne                            R.string.battery_sugg_apps_gps, ACTION_LOCATION_SETTINGS);
3748fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    removeHeader = false;
3758fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                }
3768fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                break;
3778fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            case SCREEN:
378992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani                addControl(R.string.display_settings,
3798fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        R.string.battery_sugg_display,
3808fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        ACTION_DISPLAY_SETTINGS);
3818fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                removeHeader = false;
3828fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                break;
3838fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            case WIFI:
3848fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                addControl(R.string.wifi_settings,
3858fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        R.string.battery_sugg_wifi,
3868fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        ACTION_WIFI_SETTINGS);
3878fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                removeHeader = false;
3888fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                break;
3898fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            case BLUETOOTH:
3908fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                addControl(R.string.bluetooth_settings,
3918fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        R.string.battery_sugg_bluetooth_basic,
3928fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                        ACTION_BLUETOOTH_SETTINGS);
3938fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                removeHeader = false;
3948fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                break;
3958fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            case CELL:
3968fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                if (mNoCoverage > 10) {
3978fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    addControl(R.string.radio_controls_title,
3988fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                            R.string.battery_sugg_radio,
3998fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                            ACTION_WIRELESS_SETTINGS);
4008fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                    removeHeader = false;
4018fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                }
4028fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani                break;
40378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
4048fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        if (removeHeader) {
4058fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani            mControlsParent.setVisibility(View.GONE);
40678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
40778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    }
40878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
4098fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    private void addControl(int title, int summary, int action) {
4108fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        final Resources res = getResources();
41159a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        LayoutInflater inflater = getActivity().getLayoutInflater();
4128fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_action_item,null);
4138fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        mControlsParent.addView(item);
4148fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        Button actionButton = (Button) item.findViewById(R.id.action_button);
4158fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        TextView summaryView = (TextView) item.findViewById(R.id.summary);
4168fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        actionButton.setText(res.getString(title));
4178fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        summaryView.setText(res.getString(summary));
4188fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        actionButton.setOnClickListener(this);
4198fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani        actionButton.setTag(new Integer(action));
4208fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani    }
4218fb0ec36ec2f4cb8e0a48020b1b6e79b7f45635cAmith Yamasani
42278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private void removePackagesSection() {
42378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        View view;
42459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        if ((view = mRootView.findViewById(R.id.packages_section_title)) != null) {
42578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            view.setVisibility(View.GONE);
42678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
42759a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        if ((view = mRootView.findViewById(R.id.packages_section)) != null) {
42878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            view.setVisibility(View.GONE);
42978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
43078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    }
43178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
43278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private void killProcesses() {
43378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        if (mPackages == null) return;
43459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        ActivityManager am = (ActivityManager)getActivity().getSystemService(
43578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                Context.ACTIVITY_SERVICE);
43678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        for (int i = 0; i < mPackages.length; i++) {
437517ea9ffea3c6a82d949f1588b48ae6c4d15d247Dianne Hackborn            am.forceStopPackage(mPackages[i]);
43878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
439cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        checkForceStop();
44078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    }
44178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
442cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
443cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        @Override
444cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        public void onReceive(Context context, Intent intent) {
44559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn            mForceStopButton.setEnabled(getResultCode() != Activity.RESULT_CANCELED);
446cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
447cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    };
448cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
449cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void checkForceStop() {
450cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        if (mPackages == null || mUid < Process.FIRST_APPLICATION_UID) {
451cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            mForceStopButton.setEnabled(false);
452cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn            return;
453cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        }
4545c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        for (int i = 0; i < mPackages.length; i++) {
4555c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            if (mDpm.packageHasActiveAdmins(mPackages[i])) {
4565c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                mForceStopButton.setEnabled(false);
4575c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                return;
4585c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            }
4595c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
4605c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        for (int i = 0; i < mPackages.length; i++) {
4615c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            try {
4625c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                ApplicationInfo info = mPm.getApplicationInfo(mPackages[i], 0);
4635c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                if ((info.flags&ApplicationInfo.FLAG_STOPPED) == 0) {
4645c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    mForceStopButton.setEnabled(true);
4655c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                    break;
4665c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn                }
4675c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            } catch (PackageManager.NameNotFoundException e) {
4685c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn            }
4695c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn        }
470cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
471cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Uri.fromParts("package", mPackages[0], null));
472cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_PACKAGES, mPackages);
473cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        intent.putExtra(Intent.EXTRA_UID, mUid);
474e63cc20570e7229bc72040d01b70349d6ae460f6Amith Yamasani        intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mUid));
47559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
476cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                Activity.RESULT_CANCELED, null, null);
477cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
478cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
479cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    private void reportBatteryUse() {
480cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        if (mPackages == null) return;
481cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
482cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        ApplicationErrorReport report = new ApplicationErrorReport();
483cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        report.type = ApplicationErrorReport.TYPE_BATTERY;
484cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        report.packageName = mPackages[0];
485cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        report.installerPackageName = mInstaller.getPackageName();
486cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        report.processName = mPackages[0];
487cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        report.time = System.currentTimeMillis();
488cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        report.systemApp = (mApp.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
489456dc95feeb4b669db46b764944ab24b23e41012Jacek Surazski
49059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        final Bundle args = getArguments();
491456dc95feeb4b669db46b764944ab24b23e41012Jacek Surazski        ApplicationErrorReport.BatteryInfo batteryInfo = new ApplicationErrorReport.BatteryInfo();
49259a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        batteryInfo.usagePercent = args.getInt(EXTRA_PERCENT, 1);
49359a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        batteryInfo.durationMicros = args.getLong(EXTRA_USAGE_DURATION, 0);
49459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        batteryInfo.usageDetails = args.getString(EXTRA_REPORT_DETAILS);
49559a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        batteryInfo.checkinDetails = args.getString(EXTRA_REPORT_CHECKIN_DETAILS);
496456dc95feeb4b669db46b764944ab24b23e41012Jacek Surazski        report.batteryInfo = batteryInfo;
497456dc95feeb4b669db46b764944ab24b23e41012Jacek Surazski
498cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        Intent result = new Intent(Intent.ACTION_APP_ERROR);
499cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        result.setComponent(mInstaller);
500cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        result.putExtra(Intent.EXTRA_BUG_REPORT, report);
501cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
502cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        startActivity(result);
503cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn    }
504cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn
50578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani    private void fillPackagesSection(int uid) {
5060f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        if (uid < 1) {
50778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            removePackagesSection();
50878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            return;
50978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
51059a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        ViewGroup packagesParent = (ViewGroup)mRootView.findViewById(R.id.packages_section);
51178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        if (packagesParent == null) return;
51259a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        LayoutInflater inflater = getActivity().getLayoutInflater();
51378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
51459a48604b5a803fbec6857e07f9fa1adbc6b8bb4Dianne Hackborn        PackageManager pm = getActivity().getPackageManager();
515cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn        //final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
51678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        mPackages = pm.getPackagesForUid(uid);
51778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        if (mPackages == null || mPackages.length < 2) {
51878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            removePackagesSection();
51978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            return;
52078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
52178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani
52278fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        // Convert package names to user-facing labels where possible
52378fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        for (int i = 0; i < mPackages.length; i++) {
52478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            try {
52578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                ApplicationInfo ai = pm.getApplicationInfo(mPackages[i], 0);
52678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                CharSequence label = ai.loadLabel(pm);
527cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                //Drawable icon = defaultActivityIcon;
52878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                if (label != null) {
52978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                    mPackages[i] = label.toString();
53078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                }
531cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                //if (ai.icon != 0) {
532cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                //    icon = ai.loadIcon(pm);
533cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn                //}
53478fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_package_item,
53578fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                        null);
53678fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                packagesParent.addView(item);
53778fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                TextView labelView = (TextView) item.findViewById(R.id.label);
53878fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani                labelView.setText(mPackages[i]);
53978fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            } catch (NameNotFoundException e) {
54078fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani            }
54178fd96a1c5dd7b03fa09d8b3116243cc9661c5e6Amith Yamasani        }
5427f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani    }
5430f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani
5440f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    private String getDescriptionForDrainType() {
5450f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani        return getResources().getString(sDrainTypeDesciptions[mDrainType.ordinal()]);
5460f1e11e219c9e89bb4a939cd864eb03087e784beAmith Yamasani    }
5477f6aa6283ae759c5b013c142be036617cf79f725Amith Yamasani}
548