summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/fuelgauge
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/fuelgauge')
-rw-r--r--src/com/android/settings/fuelgauge/PowerUsageDetail.java185
-rw-r--r--src/com/android/settings/fuelgauge/PowerUsageSummary.java86
2 files changed, 167 insertions, 104 deletions
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index e78e041..737627a 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -24,6 +24,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.provider.Settings;
@@ -60,12 +61,13 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
R.string.battery_desc_display,
R.string.battery_desc_apps
};
-
+
public static final int ACTION_DISPLAY_SETTINGS = 1;
public static final int ACTION_WIFI_SETTINGS = 2;
public static final int ACTION_BLUETOOTH_SETTINGS = 3;
public static final int ACTION_WIRELESS_SETTINGS = 4;
- public static final int ACTION_APP_DETAILS = 6;
+ public static final int ACTION_APP_DETAILS = 5;
+ public static final int ACTION_SECURITY_SETTINGS = 6;
public static final int USAGE_SINCE_UNPLUGGED = 1;
public static final int USAGE_SINCE_RESET = 2;
@@ -80,6 +82,7 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
public static final String EXTRA_DETAIL_VALUES = "values"; // Array of doubles
public static final String EXTRA_DRAIN_TYPE = "drainType"; // DrainType
public static final String EXTRA_ICON_PACKAGE = "iconPackage"; // String
+ public static final String EXTRA_NO_COVERAGE = "noCoverage";
public static final String EXTRA_ICON_ID = "iconId"; // Int
private static final boolean DEBUG = true;
@@ -90,16 +93,16 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
private double[] mValues;
private TextView mTitleView;
private ViewGroup mDetailsParent;
+ private ViewGroup mControlsParent;
private long mStartTime;
private DrainType mDrainType;
- private int mAction1;
- private int mAction2;
private PercentageBar mGauge;
private Drawable mAppIcon;
+ private double mNoCoverage; // Percentage of time that there was no coverage
+
+ private boolean mUsesGps;
private static final String TAG = "PowerUsageDetail";
- private Button mButton1;
- private Button mButton2;
private String[] mPackages;
@Override
@@ -128,6 +131,7 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
mUsageSince = intent.getIntExtra(EXTRA_USAGE_SINCE, USAGE_SINCE_UNPLUGGED);
mUid = intent.getIntExtra(EXTRA_UID, 0);
mDrainType = (DrainType) intent.getSerializableExtra(EXTRA_DRAIN_TYPE);
+ mNoCoverage = intent.getDoubleExtra(EXTRA_NO_COVERAGE, 0);
String iconPackage = intent.getStringExtra(EXTRA_ICON_PACKAGE);
int iconId = intent.getIntExtra(EXTRA_ICON_ID, 0);
if (!TextUtils.isEmpty(iconPackage)) {
@@ -167,40 +171,17 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
ImageView iconImage = (ImageView) findViewById(R.id.icon);
iconImage.setImageDrawable(mAppIcon);
-
+
mDetailsParent = (ViewGroup) findViewById(R.id.details);
- LayoutInflater inflater = getLayoutInflater();
- if (mTypes != null && mValues != null) {
- for (int i = 0; i < mTypes.length; i++) {
- // Only add an item if the time is greater than zero
- if (mValues[i] <= 0) continue;
- final String label = getString(mTypes[i]);
- String value = null;
- switch (mTypes[i]) {
- case R.string.usage_type_data_recv:
- case R.string.usage_type_data_send:
- value = Utils.formatBytes(this, mValues[i]);
- break;
- default:
- value = Utils.formatElapsedTime(this, mValues[i]);
- }
- ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_detail_item_text,
- null);
- mDetailsParent.addView(item);
- TextView labelView = (TextView) item.findViewById(R.id.label);
- TextView valueView = (TextView) item.findViewById(R.id.value);
- labelView.setText(label);
- valueView.setText(value);
- }
- }
+ mControlsParent = (ViewGroup) findViewById(R.id.controls);
+ fillDetailsSection();
fillPackagesSection(mUid);
fillControlsSection(mUid);
}
public void onClick(View v) {
- int action = v == mButton1 ? mAction1 : mAction2;
- doAction(action);
+ doAction((Integer) v.getTag());
}
private void doAction(int action) {
@@ -209,9 +190,12 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
startActivity(new Intent(Settings.ACTION_DISPLAY_SETTINGS));
break;
case ACTION_WIFI_SETTINGS:
- startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
+ startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
break;
case ACTION_BLUETOOTH_SETTINGS:
+ startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
+ break;
+ case ACTION_WIRELESS_SETTINGS:
startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
break;
case ACTION_APP_DETAILS:
@@ -220,14 +204,46 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
intent.putExtra("com.android.settings.ApplicationPkgName", mPackages[0]);
startActivity(intent);
break;
+ case ACTION_SECURITY_SETTINGS:
+ startActivity(new Intent(Settings.ACTION_SECURITY_SETTINGS));
+ break;
+ }
+ }
+
+ private void fillDetailsSection() {
+ LayoutInflater inflater = getLayoutInflater();
+ if (mTypes != null && mValues != null) {
+ for (int i = 0; i < mTypes.length; i++) {
+ // Only add an item if the time is greater than zero
+ if (mValues[i] <= 0) continue;
+ final String label = getString(mTypes[i]);
+ String value = null;
+ switch (mTypes[i]) {
+ case R.string.usage_type_data_recv:
+ case R.string.usage_type_data_send:
+ value = Utils.formatBytes(this, mValues[i]);
+ break;
+ case R.string.usage_type_no_coverage:
+ value = String.format("%d%%", (int) Math.floor(mValues[i]));
+ break;
+ case R.string.usage_type_gps:
+ mUsesGps = true;
+ // Fall through
+ default:
+ value = Utils.formatElapsedTime(this, mValues[i]);
+ }
+ ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_detail_item_text,
+ null);
+ mDetailsParent.addView(item);
+ TextView labelView = (TextView) item.findViewById(R.id.label);
+ TextView valueView = (TextView) item.findViewById(R.id.value);
+ labelView.setText(label);
+ valueView.setText(value);
+ }
}
}
private void fillControlsSection(int uid) {
- String label1 = null;
- String label2 = null;
- mAction1 = 0;
- mAction2 = 0;
PackageManager pm = getPackageManager();
String[] packages = pm.getPackagesForUid(uid);
PackageInfo pi = null;
@@ -237,45 +253,68 @@ public class PowerUsageDetail extends Activity implements Button.OnClickListener
ApplicationInfo ai = pi != null? pi.applicationInfo : null;
boolean isSystem = ai != null? (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0 : false;
- if (uid < 1000 || !isSystem) {
- switch (mDrainType) {
- case APP:
- //label1 = getString(R.string.battery_action_stop);
- if (packages != null) {
- label2 = getString(R.string.battery_action_app_details);
- mAction2 = ACTION_APP_DETAILS;
- }
- break;
- case SCREEN:
- label2 = getString(R.string.battery_action_display);
- mAction2 = ACTION_DISPLAY_SETTINGS;
- break;
- case WIFI:
- label2 = getString(R.string.battery_action_wifi);
- mAction2 = ACTION_WIRELESS_SETTINGS;
- break;
- case BLUETOOTH:
- //label2 = getString(R.string.battery_action_bluetooth);
- //mAction2 = ACTION_BLUETOOTH_SETTINGS;
- break;
- }
- }
- mButton1 = (Button) findViewById(R.id.action_button1);
- mButton2 = (Button) findViewById(R.id.action_button2);
- mButton1.setOnClickListener(this);
- mButton2.setOnClickListener(this);
- if (label1 == null) {
- mButton1.setVisibility(View.GONE);
- } else {
- mButton1.setText(label1);
+ boolean removeHeader = true;
+ switch (mDrainType) {
+ case APP:
+ // If it is a Java application and it's not a system application
+ if (packages != null && !isSystem) {
+ addControl(R.string.battery_action_app_details,
+ R.string.battery_sugg_apps_info, ACTION_APP_DETAILS);
+ removeHeader = false;
+ // If the application has a settings screen, jump to that
+ // TODO:
+ }
+ if (mUsesGps) {
+ addControl(R.string.security_settings_title,
+ R.string.battery_sugg_apps_gps, ACTION_SECURITY_SETTINGS);
+ removeHeader = false;
+ }
+ break;
+ case SCREEN:
+ addControl(R.string.sound_and_display_settings,
+ R.string.battery_sugg_display,
+ ACTION_DISPLAY_SETTINGS);
+ removeHeader = false;
+ break;
+ case WIFI:
+ addControl(R.string.wifi_settings,
+ R.string.battery_sugg_wifi,
+ ACTION_WIFI_SETTINGS);
+ removeHeader = false;
+ break;
+ case BLUETOOTH:
+ addControl(R.string.bluetooth_settings,
+ R.string.battery_sugg_bluetooth_basic,
+ ACTION_BLUETOOTH_SETTINGS);
+ removeHeader = false;
+ break;
+ case CELL:
+ if (mNoCoverage > 10) {
+ addControl(R.string.radio_controls_title,
+ R.string.battery_sugg_radio,
+ ACTION_WIRELESS_SETTINGS);
+ removeHeader = false;
+ }
+ break;
}
- if (label2 == null) {
- findViewById(R.id.controls_section).setVisibility(View.GONE);
- } else {
- mButton2.setText(label2);
+ if (removeHeader) {
+ mControlsParent.setVisibility(View.GONE);
}
}
+ private void addControl(int title, int summary, int action) {
+ final Resources res = getResources();
+ LayoutInflater inflater = getLayoutInflater();
+ ViewGroup item = (ViewGroup) inflater.inflate(R.layout.power_usage_action_item,null);
+ mControlsParent.addView(item);
+ Button actionButton = (Button) item.findViewById(R.id.action_button);
+ TextView summaryView = (TextView) item.findViewById(R.id.summary);
+ actionButton.setText(res.getString(title));
+ summaryView.setText(res.getString(summary));
+ actionButton.setOnClickListener(this);
+ actionButton.setTag(new Integer(action));
+ }
+
private void removePackagesSection() {
View view;
if ((view = findViewById(R.id.packages_section_title)) != null) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 8df0919..3dc9914 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -80,9 +80,6 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
private double mMaxPower = 1;
private double mTotalPower;
-
- private boolean mScaleByMax = true;
-
private PowerProfile mPowerProfile;
private HashMap<String,UidToDetail> mUidCache = new HashMap<String,UidToDetail>();
@@ -137,15 +134,19 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
Math.ceil(sipper.getSortValue() * 100 / mMaxPower));
intent.putExtra(PowerUsageDetail.EXTRA_ICON_PACKAGE, sipper.defaultPackageName);
intent.putExtra(PowerUsageDetail.EXTRA_ICON_ID, sipper.iconId);
+ intent.putExtra(PowerUsageDetail.EXTRA_NO_COVERAGE, sipper.noCoveragePercent);
if (sipper.uidObj != null) {
intent.putExtra(PowerUsageDetail.EXTRA_UID, sipper.uidObj.getUid());
}
intent.putExtra(PowerUsageDetail.EXTRA_DRAIN_TYPE, sipper.drainType);
+
+ int[] types;
+ double[] values;
switch (sipper.drainType) {
case APP:
{
Uid uid = sipper.uidObj;
- int[] types = new int[] {
+ types = new int[] {
R.string.usage_type_cpu,
R.string.usage_type_cpu_foreground,
R.string.usage_type_gps,
@@ -154,7 +155,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
R.string.usage_type_audio,
R.string.usage_type_video,
};
- double[] values = new double[] {
+ values = new double[] {
sipper.cpuTime,
sipper.cpuFgTime,
sipper.gpsTime,
@@ -163,23 +164,33 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
0,
0
};
- intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
- intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
}
break;
+ case CELL:
+ {
+ types = new int[] {
+ R.string.usage_type_on_time,
+ R.string.usage_type_no_coverage
+ };
+ values = new double[] {
+ sipper.usageTime,
+ sipper.noCoveragePercent
+ };
+ }
+ break;
default:
{
- int[] types = new int[] {
+ types = new int[] {
R.string.usage_type_on_time
};
- double[] values = new double[] {
+ values = new double[] {
sipper.usageTime
};
- intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
- intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
}
}
+ intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_TYPES, types);
+ intent.putExtra(PowerUsageDetail.EXTRA_DETAIL_VALUES, values);
startActivity(intent);
return super.onPreferenceTreeClick(preferenceScreen, preference);
@@ -243,19 +254,19 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
mAppListGroup.setOrderingAsAdded(false);
Collections.sort(mUsageList);
- for (BatterySipper g : mUsageList) {
- if (g.getSortValue() < MIN_POWER_THRESHOLD) continue;
- double percent = ((g.getSortValue() / mTotalPower) * 100);
- if (percent < 1) continue;
- PowerGaugePreference pref = new PowerGaugePreference(this, g.getIcon(), g);
- double scaleByMax = (g.getSortValue() * 100) / mMaxPower;
- g.percent = percent;
- pref.setTitle(g.name);
- pref.setPercent(percent);
- pref.setOrder(Integer.MAX_VALUE - (int) g.getSortValue()); // Invert the order
- pref.setGaugeValue(mScaleByMax ? scaleByMax : percent);
- if (g.uidObj != null) {
- pref.setKey(Integer.toString(g.uidObj.getUid()));
+ for (BatterySipper sipper : mUsageList) {
+ if (sipper.getSortValue() < MIN_POWER_THRESHOLD) continue;
+ final double percentOfTotal = ((sipper.getSortValue() / mTotalPower) * 100);
+ if (percentOfTotal < 1) continue;
+ PowerGaugePreference pref = new PowerGaugePreference(this, sipper.getIcon(), sipper);
+ double percentOfMax = (sipper.getSortValue() * 100) / mMaxPower;
+ sipper.percent = percentOfTotal;
+ pref.setTitle(sipper.name);
+ pref.setPercent(percentOfTotal);
+ pref.setOrder(Integer.MAX_VALUE - (int) sipper.getSortValue()); // Invert the order
+ pref.setGaugeValue(percentOfMax);
+ if (sipper.uidObj != null) {
+ pref.setKey(Integer.toString(sipper.uidObj.getUid()));
}
mAppListGroup.addPreference(pref);
if (mAppListGroup.getPreferenceCount() > MAX_ITEMS_TO_LIST) break;
@@ -275,7 +286,9 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
private void updateStatsPeriod(long duration) {
String durationString = Utils.formatElapsedTime(this, duration / 1000);
- String label = getString(R.string.battery_stats_duration, durationString);
+ String label = getString(mStats.isOnBattery()
+ ? R.string.battery_stats_duration
+ : R.string.battery_stats_last_duration, durationString);
setTitle(label);
}
@@ -415,8 +428,13 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
* mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ON, i);
signalTimeMs += strengthTimeMs;
}
- addEntry(getString(R.string.power_cell), DrainType.CELL, signalTimeMs,
+ BatterySipper bs =
+ addEntry(getString(R.string.power_cell), DrainType.CELL, signalTimeMs,
android.R.drawable.ic_menu_sort_by_size, power);
+ if (signalTimeMs != 0) {
+ bs.noCoveragePercent = mStats.getPhoneSignalStrengthTime(0, uSecNow, mStatsType)
+ / 1000 * 100.0 / signalTimeMs;
+ }
}
private void addWiFiUsage(long uSecNow) {
@@ -441,6 +459,10 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
long btOnTimeMs = mStats.getBluetoothOnTime(uSecNow, mStatsType) / 1000;
double btPower = btOnTimeMs * mPowerProfile.getAveragePower(PowerProfile.POWER_BLUETOOTH_ON)
/ 1000;
+ int btPingCount = mStats.getBluetoothPingCount();
+ btPower += (btPingCount
+ * mPowerProfile.getAveragePower(PowerProfile.POWER_BLUETOOTH_AT_CMD)) / 1000;
+
addEntry(getString(R.string.power_bluetooth), DrainType.IDLE, btOnTimeMs,
com.android.internal.R.drawable.ic_volume_bluetooth_in_call, btPower);
}
@@ -456,7 +478,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
mStats.getMobileTcpBytesSent(mStatsType);
final long wifiData = mStats.getTotalTcpBytesReceived(mStatsType) +
mStats.getTotalTcpBytesSent(mStatsType) - mobileData;
- final long radioDataUptimeMs = mStats.getRadioDataUptimeMs();
+ final long radioDataUptimeMs = mStats.getRadioDataUptime() / 1000;
final long mobileBps = radioDataUptimeMs != 0
? mobileData * 8 * 1000 / radioDataUptimeMs
: MOBILE_BPS;
@@ -488,13 +510,15 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
addRadioUsage(uSecNow);
}
- private void addEntry(String label, DrainType drainType, long time, int iconId, double power) {
+ private BatterySipper addEntry(String label, DrainType drainType, long time, int iconId,
+ double power) {
if (power > mMaxPower) mMaxPower = power;
mTotalPower += power;
BatterySipper bs = new BatterySipper(label, drainType, iconId, null, new double[] {power});
bs.usageTime = time;
bs.iconId = iconId;
mUsageList.add(bs);
+ return bs;
}
private void load() {
@@ -523,6 +547,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
long gpsTime;
long cpuFgTime;
double percent;
+ double noCoveragePercent;
String defaultPackageName;
BatterySipper(String label, DrainType drainType, int iconId, Uid uid, double[] values) {
@@ -533,7 +558,6 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
icon = getResources().getDrawable(iconId);
}
if (values != null) value = values[0];
- //if (uid > 0 && (mLabel == null || mIcon == null) // TODO:
if ((label == null || iconId == 0) && uid != null) {
getQuickNameIconForUid(uid);
}
@@ -631,9 +655,9 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
// Look for an official name for this UID.
for (String pkgName : packages) {
try {
- PackageInfo pi = pm.getPackageInfo(pkgName, 0);
+ final PackageInfo pi = pm.getPackageInfo(pkgName, 0);
if (pi.sharedUserLabel != 0) {
- CharSequence nm = pm.getText(pkgName,
+ final CharSequence nm = pm.getText(pkgName,
pi.sharedUserLabel, pi.applicationInfo);
if (nm != null) {
name = nm.toString();