Calculate and account for memory power use

Use PowerProfile to calculate mAh (MemoryPowerCalculator), and
involve this calculation in the overall accounting of battery
for when the phone is unplugged from a charger.

Note: Depends on ag/1196281

Change-Id: Id02bef19c9b250c614df0a6c88711b486faaef46
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index f0cc390..370f7f9 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -30,6 +30,7 @@
 import android.telephony.SignalStrength;
 import android.text.format.DateFormat;
 import android.util.ArrayMap;
+import android.util.LongSparseArray;
 import android.util.MutableBoolean;
 import android.util.Pair;
 import android.util.Printer;
@@ -2450,6 +2451,8 @@
 
     public abstract Map<String, ? extends Timer> getKernelWakelockStats();
 
+    public abstract LongSparseArray<? extends Timer> getKernelMemoryStats();
+
     public abstract void writeToParcelWithoutUids(Parcel out, int flags);
 
     private final static void formatTimeRaw(StringBuilder out, long seconds) {
@@ -4116,6 +4119,17 @@
             }
         }
 
+        final LongSparseArray<? extends Timer> mMemoryStats = getKernelMemoryStats();
+        pw.println("Memory Stats");
+        for (int i = 0; i < mMemoryStats.size(); i++) {
+            sb.setLength(0);
+            sb.append("Bandwidth ");
+            sb.append(mMemoryStats.keyAt(i));
+            sb.append(" Time ");
+            sb.append(mMemoryStats.valueAt(i).getTotalTimeLocked(rawRealtime, which));
+            pw.println(sb.toString());
+        }
+
         for (int iu=0; iu<NU; iu++) {
             final int uid = uidStats.keyAt(iu);
             if (reqUid >= 0 && uid != reqUid && uid != Process.SYSTEM_UID) {