summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/BatteryStats.java22
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java67
-rw-r--r--core/java/com/android/internal/os/PowerProfile.java5
-rw-r--r--services/java/com/android/server/am/BatteryStatsService.java2
4 files changed, 87 insertions, 9 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 528def5..e203fd5 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -508,6 +508,19 @@ public abstract class BatteryStats implements Parcelable {
public abstract long getBatteryUptime(long curTime);
/**
+ * @deprecated use getRadioDataUptime
+ */
+ public long getRadioDataUptimeMs() {
+ return getRadioDataUptime() / 1000;
+ }
+
+ /**
+ * Returns the time that the radio was on for data transfers.
+ * @return the uptime in microseconds while unplugged
+ */
+ public abstract long getRadioDataUptime();
+
+ /**
* Returns the current battery realtime in microseconds.
*
* @param curTime the amount of elapsed realtime in microseconds.
@@ -1128,7 +1141,14 @@ public abstract class BatteryStats implements Parcelable {
}
if (!didOne) sb.append("No activity");
pw.println(sb.toString());
-
+
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Radio data uptime when unplugged: ");
+ sb.append(getRadioDataUptime() / 1000);
+ sb.append(" ms");
+ pw.println(sb.toString());
+
sb.setLength(0);
sb.append(prefix);
sb.append(" Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000);
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index a03802d..a449e5f 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -16,6 +16,7 @@
package com.android.internal.os;
+import android.bluetooth.BluetoothHeadset;
import android.os.BatteryStats;
import android.os.NetStat;
import android.os.Parcel;
@@ -128,7 +129,10 @@ public final class BatteryStatsImpl extends BatteryStats {
boolean mBluetoothOn;
StopwatchTimer mBluetoothOnTimer;
-
+
+ /** Bluetooth headset object */
+ BluetoothHeadset mBtHeadset;
+
/**
* These provide time bases that discount the time the device is plugged
* in to power.
@@ -160,6 +164,9 @@ public final class BatteryStatsImpl extends BatteryStats {
private long mRadioDataUptime;
private long mRadioDataStart;
+ private int mBluetoothPingCount;
+ private int mBluetoothPingStart = -1;
+
/*
* Holds a SamplingTimer associated with each kernel wakelock name being tracked.
*/
@@ -920,14 +927,18 @@ public final class BatteryStatsImpl extends BatteryStats {
dataTransfer[STATS_UNPLUGGED] = currentBytes;
}
- private long getCurrentRadioDataUptimeMs() {
+ /**
+ * Radio uptime in microseconds when transferring data. This value is very approximate.
+ * @return
+ */
+ private long getCurrentRadioDataUptime() {
try {
File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
if (!awakeTimeFile.exists()) return 0;
BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
String line = br.readLine();
br.close();
- return Long.parseLong(line);
+ return Long.parseLong(line) * 1000;
} catch (NumberFormatException nfe) {
// Nothing
} catch (IOException ioe) {
@@ -936,14 +947,44 @@ public final class BatteryStatsImpl extends BatteryStats {
return 0;
}
+ /**
+ * @deprecated use getRadioDataUptime
+ */
public long getRadioDataUptimeMs() {
+ return getRadioDataUptime() / 1000;
+ }
+
+ /**
+ * Returns the duration that the cell radio was up for data transfers.
+ */
+ public long getRadioDataUptime() {
if (mRadioDataStart == -1) {
return mRadioDataUptime;
} else {
- return getCurrentRadioDataUptimeMs() - mRadioDataStart;
+ return getCurrentRadioDataUptime() - mRadioDataStart;
}
}
+ private int getCurrentBluetoothPingCount() {
+ if (mBtHeadset != null) {
+ return mBtHeadset.getBatteryUsageHint();
+ }
+ return -1;
+ }
+
+ public int getBluetoothPingCount() {
+ if (mBluetoothPingStart == -1) {
+ return mBluetoothPingCount;
+ } else if (mBtHeadset != null) {
+ return getCurrentBluetoothPingCount() - mBluetoothPingStart;
+ }
+ return -1;
+ }
+
+ public void setBtHeadset(BluetoothHeadset headset) {
+ mBtHeadset = headset;
+ }
+
public void doUnplug(long batteryUptime, long batteryRealtime) {
for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
Uid u = mUidStats.valueAt(iu);
@@ -961,8 +1002,11 @@ public final class BatteryStatsImpl extends BatteryStats {
doDataUnplug(mTotalDataRx, NetStat.getTotalRxBytes());
doDataUnplug(mTotalDataTx, NetStat.getTotalTxBytes());
// Track radio awake time
- mRadioDataStart = getCurrentRadioDataUptimeMs();
+ mRadioDataStart = getCurrentRadioDataUptime();
mRadioDataUptime = 0;
+ // Track bt headset ping count
+ mBluetoothPingStart = getCurrentBluetoothPingCount();
+ mBluetoothPingCount = 0;
}
public void doPlug(long batteryUptime, long batteryRealtime) {
@@ -985,8 +1029,12 @@ public final class BatteryStatsImpl extends BatteryStats {
doDataPlug(mTotalDataRx, NetStat.getTotalRxBytes());
doDataPlug(mTotalDataTx, NetStat.getTotalTxBytes());
// Track radio awake time
- mRadioDataUptime = getRadioDataUptimeMs();
+ mRadioDataUptime = getRadioDataUptime();
mRadioDataStart = -1;
+
+ // Track bt headset ping count
+ mBluetoothPingCount = getBluetoothPingCount();
+ mBluetoothPingStart = -1;
}
public void noteStartGps(int uid) {
@@ -3335,6 +3383,9 @@ public final class BatteryStatsImpl extends BatteryStats {
mRadioDataUptime = in.readLong();
mRadioDataStart = -1;
+ mBluetoothPingCount = in.readInt();
+ mBluetoothPingStart = -1;
+
mKernelWakelockStats.clear();
int NKW = in.readInt();
for (int ikw = 0; ikw < NKW; ikw++) {
@@ -3415,7 +3466,9 @@ public final class BatteryStatsImpl extends BatteryStats {
out.writeLong(getTotalTcpBytesSent(STATS_UNPLUGGED));
// Write radio uptime for data
- out.writeLong(getRadioDataUptimeMs());
+ out.writeLong(getRadioDataUptime());
+
+ out.writeInt(getBluetoothPingCount());
out.writeInt(mKernelWakelockStats.size());
for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java
index 4a8d8b1..94f703a 100644
--- a/core/java/com/android/internal/os/PowerProfile.java
+++ b/core/java/com/android/internal/os/PowerProfile.java
@@ -87,6 +87,11 @@ public class PowerProfile {
public static final String POWER_BLUETOOTH_ACTIVE = "bluetooth.active";
/**
+ * Power consumption when Bluetooth driver gets an AT command.
+ */
+ public static final String POWER_BLUETOOTH_AT_CMD = "bluetooth.at";
+
+ /**
* Power consumption when screen is on, not including the backlight power.
*/
public static final String POWER_SCREEN_ON = "screen.on";
diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java
index 39a1ee0..c834b34 100644
--- a/services/java/com/android/server/am/BatteryStatsService.java
+++ b/services/java/com/android/server/am/BatteryStatsService.java
@@ -41,7 +41,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub {
final BatteryStatsImpl mStats;
Context mContext;
-
+
BatteryStatsService(String filename) {
mStats = new BatteryStatsImpl(filename);
}