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