Bluetooth at command tracking.
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 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 @@
         }
         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 @@
     
     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 @@
     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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 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";