Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 099bc627 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Battery stats improvements.

- Adjust total power use when there is unaccounted power so that our
  percentages don't end up > 100%.
- Fix accounting of isolated uids to be against the owning real app
  uids.
- Rework how we put cpu use into the battery stats to no longer need
  this uid name cache that can confuse the uid it is associated with.
- Finish implementing events in the history, adding a string pool and
  reading/writing/dumping them.
- Add first two events: processes starting and finishing.
- Fix alarm manager reporting of wakeup alarms to be adjusted by the
  WorkSource associated with the alarm, so they are blamed on the
  correct app.
- New "--history" dump option allows you to perform a checkin of
  only the history data.
- Fixed BitDescription bug that would cause incorrect printing of
  changes in some states.

Change-Id: Ifbdd0740132ed178033851c58f165adc0d50f716
parent 45c44702
Loading
Loading
Loading
Loading
+10 −5
Original line number Original line Diff line number Diff line
@@ -101,9 +101,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
        }
        }
    }
    }


    static public void noteWakeupAlarm(PendingIntent ps) {
    static public void noteWakeupAlarm(PendingIntent ps, int sourceUid, String sourcePkg) {
        try {
        try {
            getDefault().noteWakeupAlarm(ps.getTarget());
            getDefault().noteWakeupAlarm(ps.getTarget(), sourceUid, sourcePkg);
        } catch (RemoteException ex) {
        } catch (RemoteException ex) {
        }
        }
    }
    }
@@ -1258,7 +1258,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            data.enforceInterface(IActivityManager.descriptor);
            data.enforceInterface(IActivityManager.descriptor);
            IIntentSender is = IIntentSender.Stub.asInterface(
            IIntentSender is = IIntentSender.Stub.asInterface(
                    data.readStrongBinder());
                    data.readStrongBinder());
            noteWakeupAlarm(is);
            int sourceUid = data.readInt();
            String sourcePkg = data.readString();
            noteWakeupAlarm(is, sourceUid, sourcePkg);
            reply.writeNoException();
            reply.writeNoException();
            return true;
            return true;
        }
        }
@@ -3651,10 +3653,13 @@ class ActivityManagerProxy implements IActivityManager
        mRemote.transact(ENTER_SAFE_MODE_TRANSACTION, data, null, 0);
        mRemote.transact(ENTER_SAFE_MODE_TRANSACTION, data, null, 0);
        data.recycle();
        data.recycle();
    }
    }
    public void noteWakeupAlarm(IIntentSender sender) throws RemoteException {
    public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg)
            throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel data = Parcel.obtain();
        data.writeStrongBinder(sender.asBinder());
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(sender.asBinder());
        data.writeInt(sourceUid);
        data.writeString(sourcePkg);
        mRemote.transact(NOTE_WAKEUP_ALARM_TRANSACTION, data, null, 0);
        mRemote.transact(NOTE_WAKEUP_ALARM_TRANSACTION, data, null, 0);
        data.recycle();
        data.recycle();
    }
    }
+2 −1
Original line number Original line Diff line number Diff line
@@ -243,7 +243,8 @@ public interface IActivityManager extends IInterface {


    public void enterSafeMode() throws RemoteException;
    public void enterSafeMode() throws RemoteException;
    
    
    public void noteWakeupAlarm(IIntentSender sender) throws RemoteException;
    public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg)
            throws RemoteException;


    public boolean killPids(int[] pids, String reason, boolean secure) throws RemoteException;
    public boolean killPids(int[] pids, String reason, boolean secure) throws RemoteException;
    public boolean killProcessesBelowForeground(String reason) throws RemoteException;
    public boolean killProcessesBelowForeground(String reason) throws RemoteException;
+78 −13
Original line number Original line Diff line number Diff line
@@ -162,6 +162,7 @@ public abstract class BatteryStats implements Parcelable {
    private static final String WIFI_DATA = "wfl";
    private static final String WIFI_DATA = "wfl";
    private static final String MISC_DATA = "m";
    private static final String MISC_DATA = "m";
    private static final String GLOBAL_NETWORK_DATA = "gn";
    private static final String GLOBAL_NETWORK_DATA = "gn";
    private static final String HISTORY_STRING_POOL = "hsp";
    private static final String HISTORY_DATA = "h";
    private static final String HISTORY_DATA = "h";
    private static final String SCREEN_BRIGHTNESS_DATA = "br";
    private static final String SCREEN_BRIGHTNESS_DATA = "br";
    private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt";
    private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt";
@@ -354,6 +355,11 @@ public abstract class BatteryStats implements Parcelable {
                public long usedTime;
                public long usedTime;
            }
            }


            /**
             * Returns true if this process is still active in the battery stats.
             */
            public abstract boolean isActive();

            /**
            /**
             * Returns the total time (in 1/100 sec) spent executing in user code.
             * Returns the total time (in 1/100 sec) spent executing in user code.
             *
             *
@@ -446,9 +452,6 @@ public abstract class BatteryStats implements Parcelable {
    }
    }


    public final static class HistoryItem implements Parcelable {
    public final static class HistoryItem implements Parcelable {
        static final String TAG = "HistoryItem";
        static final boolean DEBUG = false;
        
        public HistoryItem next;
        public HistoryItem next;
        
        
        public long time;
        public long time;
@@ -526,12 +529,14 @@ public abstract class BatteryStats implements Parcelable {
        public int states;
        public int states;


        public static final int EVENT_NONE = 0;
        public static final int EVENT_NONE = 0;
        public static final int EVENT_APP_FOREGROUND = 1;
        public static final int EVENT_PROC_STARTED = 1;
        public static final int EVENT_PROC_FINISHED = 2;


        // For CMD_EVENT.
        // For CMD_EVENT.
        public int eventCode;
        public int eventCode;
        public int eventUid;
        public String eventName;
        public String eventName;
        public int eventNameIdx;    // only filled in when iterating.
        public int eventUid;


        public HistoryItem() {
        public HistoryItem() {
        }
        }
@@ -579,6 +584,7 @@ public abstract class BatteryStats implements Parcelable {
                eventCode = src.readInt();
                eventCode = src.readInt();
                eventUid = src.readInt();
                eventUid = src.readInt();
                eventName = src.readString();
                eventName = src.readString();
                eventNameIdx = 0;
            } else {
            } else {
                eventCode = EVENT_NONE;
                eventCode = EVENT_NONE;
            }
            }
@@ -612,6 +618,7 @@ public abstract class BatteryStats implements Parcelable {
            eventCode = o.eventCode;
            eventCode = o.eventCode;
            eventUid = o.eventUid;
            eventUid = o.eventUid;
            eventName = o.eventName;
            eventName = o.eventName;
            eventNameIdx = o.eventNameIdx;
        }
        }


        public void setTo(long time, byte cmd, int eventCode, int eventUid, String eventName,
        public void setTo(long time, byte cmd, int eventCode, int eventUid, String eventName,
@@ -621,6 +628,7 @@ public abstract class BatteryStats implements Parcelable {
            this.eventCode = eventCode;
            this.eventCode = eventCode;
            this.eventUid = eventUid;
            this.eventUid = eventUid;
            this.eventName = eventName;
            this.eventName = eventName;
            this.eventNameIdx = 0;
            batteryLevel = o.batteryLevel;
            batteryLevel = o.batteryLevel;
            batteryStatus = o.batteryStatus;
            batteryStatus = o.batteryStatus;
            batteryHealth = o.batteryHealth;
            batteryHealth = o.batteryHealth;
@@ -681,6 +689,10 @@ public abstract class BatteryStats implements Parcelable {
    
    
    public abstract boolean startIteratingHistoryLocked();
    public abstract boolean startIteratingHistoryLocked();


    public abstract int getHistoryStringPoolSize();

    public abstract String getHistoryStringPoolItem(int index);

    public abstract boolean getNextHistoryLocked(HistoryItem out);
    public abstract boolean getNextHistoryLocked(HistoryItem out);


    public abstract void finishIteratingHistoryLocked();
    public abstract void finishIteratingHistoryLocked();
@@ -1316,7 +1328,7 @@ public abstract class BatteryStats implements Parcelable {
        if (sippers != null && sippers.size() > 0) {
        if (sippers != null && sippers.size() > 0) {
            dumpLine(pw, 0 /* uid */, category, POWER_USE_SUMMARY_DATA,
            dumpLine(pw, 0 /* uid */, category, POWER_USE_SUMMARY_DATA,
                    BatteryStatsHelper.makemAh(helper.getPowerProfile().getBatteryCapacity()),
                    BatteryStatsHelper.makemAh(helper.getPowerProfile().getBatteryCapacity()),
                    BatteryStatsHelper.makemAh(helper.getTotalPower()),
                    BatteryStatsHelper.makemAh(helper.getComputedPower()),
                    BatteryStatsHelper.makemAh(helper.getMinDrainedPower()),
                    BatteryStatsHelper.makemAh(helper.getMinDrainedPower()),
                    BatteryStatsHelper.makemAh(helper.getMaxDrainedPower()));
                    BatteryStatsHelper.makemAh(helper.getMaxDrainedPower()));
            for (int i=0; i<sippers.size(); i++) {
            for (int i=0; i<sippers.size(); i++) {
@@ -1835,7 +1847,7 @@ public abstract class BatteryStats implements Parcelable {
            pw.print(prefix); pw.println("  Estimated power use (mAh):");
            pw.print(prefix); pw.println("  Estimated power use (mAh):");
            pw.print(prefix); pw.print("    Capacity: ");
            pw.print(prefix); pw.print("    Capacity: ");
                    printmAh(pw, helper.getPowerProfile().getBatteryCapacity());
                    printmAh(pw, helper.getPowerProfile().getBatteryCapacity());
                    pw.print(", Computed drain: "); printmAh(pw, helper.getTotalPower());
                    pw.print(", Computed drain: "); printmAh(pw, helper.getComputedPower());
                    pw.print(", Min drain: "); printmAh(pw, helper.getMinDrainedPower());
                    pw.print(", Min drain: "); printmAh(pw, helper.getMinDrainedPower());
                    pw.print(", Max drain: "); printmAh(pw, helper.getMaxDrainedPower());
                    pw.print(", Max drain: "); printmAh(pw, helper.getMaxDrainedPower());
                    pw.println();
                    pw.println();
@@ -2244,10 +2256,14 @@ public abstract class BatteryStats implements Parcelable {
        if (diff == 0) return;
        if (diff == 0) return;
        for (int i=0; i<descriptions.length; i++) {
        for (int i=0; i<descriptions.length; i++) {
            BitDescription bd = descriptions[i];
            BitDescription bd = descriptions[i];
            if ((diff&bd.mask) != 0) {
            int mask = bd.mask;
            if (bd.shift > 0) {
                mask <<= bd.shift;
            }
            if ((diff&mask) != 0) {
                pw.print(longNames ? " " : ",");
                pw.print(longNames ? " " : ",");
                if (bd.shift < 0) {
                if (bd.shift < 0) {
                    pw.print((newval&bd.mask) != 0 ? "+" : "-");
                    pw.print((newval&mask) != 0 ? "+" : "-");
                    pw.print(longNames ? bd.name : bd.shortName);
                    pw.print(longNames ? bd.name : bd.shortName);
                } else {
                } else {
                    pw.print(longNames ? bd.name : bd.shortName);
                    pw.print(longNames ? bd.name : bd.shortName);
@@ -2404,6 +2420,38 @@ public abstract class BatteryStats implements Parcelable {
                }
                }
                printBitDescriptions(pw, oldState, rec.states,
                printBitDescriptions(pw, oldState, rec.states,
                        HISTORY_STATE_DESCRIPTIONS, !checkin);
                        HISTORY_STATE_DESCRIPTIONS, !checkin);
                if (rec.eventCode != HistoryItem.EVENT_NONE) {
                    switch (rec.eventCode) {
                        case HistoryItem.EVENT_PROC_STARTED:
                            pw.print(checkin ? ",PrSt=" : " procstart=");
                            break;
                        case HistoryItem.EVENT_PROC_FINISHED:
                            pw.print(checkin ? ",PrFn=" : " procfin=");
                            break;
                        default:
                            if (checkin) {
                                pw.print(",?cmd_");
                                pw.print(rec.eventCode);
                                pw.print("=");
                            } else {
                                pw.print(" cmd_");
                                pw.print(rec.eventCode);
                                pw.print("=");
                            }
                            break;
                    }
                    if (checkin) {
                        pw.print(rec.eventUid);
                    } else {
                        UserHandle.formatUid(pw, rec.eventUid);
                    }
                    pw.print(":");
                    if (checkin) {
                        pw.print(rec.eventNameIdx);
                    } else {
                        pw.print(rec.eventName);
                    }
                }
                pw.println();
                pw.println();
            }
            }
            oldState = rec.states;
            oldState = rec.states;
@@ -2416,7 +2464,8 @@ public abstract class BatteryStats implements Parcelable {
     * @param pw a Printer to receive the dump output.
     * @param pw a Printer to receive the dump output.
     */
     */
    @SuppressWarnings("unused")
    @SuppressWarnings("unused")
    public void dumpLocked(Context context, PrintWriter pw, boolean isUnpluggedOnly, int reqUid) {
    public void dumpLocked(Context context, PrintWriter pw, boolean isUnpluggedOnly, int reqUid,
            boolean historyOnly) {
        prepareForDumpLocked();
        prepareForDumpLocked();


        long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
        long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
@@ -2442,6 +2491,10 @@ public abstract class BatteryStats implements Parcelable {
            pw.println("");
            pw.println("");
        }
        }


        if (historyOnly) {
            return;
        }

        SparseArray<? extends Uid> uidStats = getUidStats();
        SparseArray<? extends Uid> uidStats = getUidStats();
        final int NU = uidStats.size();
        final int NU = uidStats.size();
        boolean didPid = false;
        boolean didPid = false;
@@ -2483,14 +2536,22 @@ public abstract class BatteryStats implements Parcelable {
    @SuppressWarnings("unused")
    @SuppressWarnings("unused")
    public void dumpCheckinLocked(Context context,
    public void dumpCheckinLocked(Context context,
            PrintWriter pw, List<ApplicationInfo> apps, boolean isUnpluggedOnly,
            PrintWriter pw, List<ApplicationInfo> apps, boolean isUnpluggedOnly,
            boolean includeHistory) {
            boolean includeHistory, boolean historyOnly) {
        prepareForDumpLocked();
        prepareForDumpLocked();
        
        
        long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
        long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();


        if (includeHistory) {
        if (includeHistory || historyOnly) {
            final HistoryItem rec = new HistoryItem();
            final HistoryItem rec = new HistoryItem();
            if (startIteratingHistoryLocked()) {
            if (startIteratingHistoryLocked()) {
                for (int i=0; i<getHistoryStringPoolSize(); i++) {
                    pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
                    pw.print(HISTORY_STRING_POOL); pw.print(',');
                    pw.print(i);
                    pw.print(',');
                    pw.print(getHistoryStringPoolItem(i));
                    pw.println();
                }
                HistoryPrinter hprinter = new HistoryPrinter();
                HistoryPrinter hprinter = new HistoryPrinter();
                while (getNextHistoryLocked(rec)) {
                while (getNextHistoryLocked(rec)) {
                    pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
                    pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(',');
@@ -2501,6 +2562,10 @@ public abstract class BatteryStats implements Parcelable {
            }
            }
        }
        }


        if (historyOnly) {
            return;
        }

        if (apps != null) {
        if (apps != null) {
            SparseArray<ArrayList<String>> uids = new SparseArray<ArrayList<String>>();
            SparseArray<ArrayList<String>> uids = new SparseArray<ArrayList<String>>();
            for (int i=0; i<apps.size(); i++) {
            for (int i=0; i<apps.size(); i++) {
+6 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,12 @@ interface IBatteryStats {


    // Remaining methods are only used in Java.
    // Remaining methods are only used in Java.
    byte[] getStatistics();
    byte[] getStatistics();

    void addIsolatedUid(int isolatedUid, int appUid);
    void removeIsolatedUid(int isolatedUid, int appUid);

    void noteEvent(int code, String name, int uid);

    void noteStartWakelock(int uid, int pid, String name, int type);
    void noteStartWakelock(int uid, int pid, String name, int type);
    void noteStopWakelock(int uid, int pid, String name, int type);
    void noteStopWakelock(int uid, int pid, String name, int type);


+41 −30
Original line number Original line Diff line number Diff line
@@ -41,7 +41,6 @@ import android.util.SparseArray;
import com.android.internal.app.IBatteryStats;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.BatterySipper.DrainType;
import com.android.internal.os.BatterySipper.DrainType;


import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
@@ -84,6 +83,7 @@ public class BatteryStatsHelper {


    private long mStatsPeriod = 0;
    private long mStatsPeriod = 0;
    private double mMaxPower = 1;
    private double mMaxPower = 1;
    private double mComputedPower;
    private double mTotalPower;
    private double mTotalPower;
    private double mWifiPower;
    private double mWifiPower;
    private double mBluetoothPower;
    private double mBluetoothPower;
@@ -156,6 +156,7 @@ public class BatteryStatsHelper {
        getStats();
        getStats();


        mMaxPower = 0;
        mMaxPower = 0;
        mComputedPower = 0;
        mTotalPower = 0;
        mTotalPower = 0;
        mWifiPower = 0;
        mWifiPower = 0;
        mBluetoothPower = 0;
        mBluetoothPower = 0;
@@ -195,21 +196,17 @@ public class BatteryStatsHelper {
        processMiscUsage();
        processMiscUsage();


        if (DEBUG) {
        if (DEBUG) {
            Log.d(TAG, "Accuracy: total computed=" + makemAh(mTotalPower) + ", min discharge="
            Log.d(TAG, "Accuracy: total computed=" + makemAh(mComputedPower) + ", min discharge="
                    + makemAh(mMinDrainedPower) + ", max discharge=" + makemAh(mMaxDrainedPower));
                    + makemAh(mMinDrainedPower) + ", max discharge=" + makemAh(mMaxDrainedPower));
        }
        }
        if (true || mStats.getLowDischargeAmountSinceCharge() > 10) {
        mTotalPower = mComputedPower;
            if (mMinDrainedPower > mTotalPower) {
        if (mStats.getLowDischargeAmountSinceCharge() > 1) {
                double amount = mMinDrainedPower - mTotalPower;
            if (mMinDrainedPower > mComputedPower) {
                if (mMaxPower < amount) {
                double amount = mMinDrainedPower - mComputedPower;
                    mMaxPower = amount;
                mTotalPower = mMinDrainedPower;
                }
                addEntryNoTotal(BatterySipper.DrainType.UNACCOUNTED, 0, amount);
                addEntryNoTotal(BatterySipper.DrainType.UNACCOUNTED, 0, amount);
            } else if (mMaxDrainedPower < mTotalPower) {
            } else if (mMaxDrainedPower < mComputedPower) {
                double amount = mTotalPower - mMaxDrainedPower;
                double amount = mComputedPower - mMaxDrainedPower;
                if (mMaxPower < amount) {
                    mMaxPower = amount;
                }
                addEntryNoTotal(BatterySipper.DrainType.OVERCOUNTED, 0, amount);
                addEntryNoTotal(BatterySipper.DrainType.OVERCOUNTED, 0, amount);
            }
            }
        }
        }
@@ -442,7 +439,7 @@ public class BatteryStatsHelper {
                } else {
                } else {
                    mUsageList.add(app);
                    mUsageList.add(app);
                    if (power > mMaxPower) mMaxPower = power;
                    if (power > mMaxPower) mMaxPower = power;
                    mTotalPower += power;
                    mComputedPower += power;
                }
                }
                if (u.getUid() == 0) {
                if (u.getUid() == 0) {
                    osApp = app;
                    osApp = app;
@@ -467,7 +464,7 @@ public class BatteryStatsHelper {
                osApp.value += power;
                osApp.value += power;
                osApp.values[0] += power;
                osApp.values[0] += power;
                if (osApp.value > mMaxPower) mMaxPower = osApp.value;
                if (osApp.value > mMaxPower) mMaxPower = osApp.value;
                mTotalPower += power;
                mComputedPower += power;
            }
            }
        }
        }
    }
    }
@@ -476,8 +473,10 @@ public class BatteryStatsHelper {
        long phoneOnTimeMs = mStats.getPhoneOnTime(mBatteryRealtime, mStatsType) / 1000;
        long phoneOnTimeMs = mStats.getPhoneOnTime(mBatteryRealtime, mStatsType) / 1000;
        double phoneOnPower = mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE)
        double phoneOnPower = mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE)
                * phoneOnTimeMs / (60*60*1000);
                * phoneOnTimeMs / (60*60*1000);
        if (phoneOnPower != 0) {
            addEntry(BatterySipper.DrainType.PHONE, phoneOnTimeMs, phoneOnPower);
            addEntry(BatterySipper.DrainType.PHONE, phoneOnTimeMs, phoneOnPower);
        }
        }
    }


    private void addScreenUsage() {
    private void addScreenUsage() {
        double power = 0;
        double power = 0;
@@ -498,8 +497,10 @@ public class BatteryStatsHelper {
            power += p;
            power += p;
        }
        }
        power /= (60*60*1000); // To hours
        power /= (60*60*1000); // To hours
        if (power != 0) {
            addEntry(BatterySipper.DrainType.SCREEN, screenOnTimeMs, power);
            addEntry(BatterySipper.DrainType.SCREEN, screenOnTimeMs, power);
        }
        }
    }


    private void addRadioUsage() {
    private void addRadioUsage() {
        double power = 0;
        double power = 0;
@@ -530,12 +531,14 @@ public class BatteryStatsHelper {
            Log.d(TAG, "Cell radio scanning: time=" + scanningTimeMs + " power=" + makemAh(p));
            Log.d(TAG, "Cell radio scanning: time=" + scanningTimeMs + " power=" + makemAh(p));
        }
        }
        power += p;
        power += p;
        if (power != 0) {
            BatterySipper bs =
            BatterySipper bs =
                    addEntry(BatterySipper.DrainType.CELL, signalTimeMs, power);
                    addEntry(BatterySipper.DrainType.CELL, signalTimeMs, power);
            if (signalTimeMs != 0) {
            if (signalTimeMs != 0) {
                bs.noCoveragePercent = noCoverageTimeMs * 100.0 / signalTimeMs;
                bs.noCoveragePercent = noCoverageTimeMs * 100.0 / signalTimeMs;
            }
            }
        }
        }
    }


    private void aggregateSippers(BatterySipper bs, List<BatterySipper> from, String tag) {
    private void aggregateSippers(BatterySipper bs, List<BatterySipper> from, String tag) {
        for (int i=0; i<from.size(); i++) {
        for (int i=0; i<from.size(); i++) {
@@ -571,10 +574,12 @@ public class BatteryStatsHelper {
        if (DEBUG && wifiPower != 0) {
        if (DEBUG && wifiPower != 0) {
            Log.d(TAG, "Wifi: time=" + runningTimeMs + " power=" + makemAh(wifiPower));
            Log.d(TAG, "Wifi: time=" + runningTimeMs + " power=" + makemAh(wifiPower));
        }
        }
        if ((wifiPower+mWifiPower) != 0) {
            BatterySipper bs = addEntry(BatterySipper.DrainType.WIFI, runningTimeMs,
            BatterySipper bs = addEntry(BatterySipper.DrainType.WIFI, runningTimeMs,
                    wifiPower + mWifiPower);
                    wifiPower + mWifiPower);
            aggregateSippers(bs, mWifiSippers, "WIFI");
            aggregateSippers(bs, mWifiSippers, "WIFI");
        }
        }
    }


    private void addIdleUsage() {
    private void addIdleUsage() {
        long idleTimeMs = (mTypeBatteryRealtime
        long idleTimeMs = (mTypeBatteryRealtime
@@ -584,8 +589,10 @@ public class BatteryStatsHelper {
        if (DEBUG && idlePower != 0) {
        if (DEBUG && idlePower != 0) {
            Log.d(TAG, "Idle: time=" + idleTimeMs + " power=" + makemAh(idlePower));
            Log.d(TAG, "Idle: time=" + idleTimeMs + " power=" + makemAh(idlePower));
        }
        }
        if (idlePower != 0) {
            addEntry(BatterySipper.DrainType.IDLE, idleTimeMs, idlePower);
            addEntry(BatterySipper.DrainType.IDLE, idleTimeMs, idlePower);
        }
        }
    }


    private void addBluetoothUsage() {
    private void addBluetoothUsage() {
        long btOnTimeMs = mStats.getBluetoothOnTime(mBatteryRealtime, mStatsType) / 1000;
        long btOnTimeMs = mStats.getBluetoothOnTime(mBatteryRealtime, mStatsType) / 1000;
@@ -602,10 +609,12 @@ public class BatteryStatsHelper {
            Log.d(TAG, "Bluetooth ping: count=" + btPingCount + " power=" + makemAh(pingPower));
            Log.d(TAG, "Bluetooth ping: count=" + btPingCount + " power=" + makemAh(pingPower));
        }
        }
        btPower += pingPower;
        btPower += pingPower;
        if ((btPower+mBluetoothPower) != 0) {
            BatterySipper bs = addEntry(BatterySipper.DrainType.BLUETOOTH, btOnTimeMs,
            BatterySipper bs = addEntry(BatterySipper.DrainType.BLUETOOTH, btOnTimeMs,
                    btPower + mBluetoothPower);
                    btPower + mBluetoothPower);
            aggregateSippers(bs, mBluetoothSippers, "Bluetooth");
            aggregateSippers(bs, mBluetoothSippers, "Bluetooth");
        }
        }
    }


    private void addUserUsage() {
    private void addUserUsage() {
        for (int i=0; i<mUserSippers.size(); i++) {
        for (int i=0; i<mUserSippers.size(); i++) {
@@ -665,7 +674,7 @@ public class BatteryStatsHelper {
    }
    }


    private BatterySipper addEntry(DrainType drainType, long time, double power) {
    private BatterySipper addEntry(DrainType drainType, long time, double power) {
        mTotalPower += power;
        mComputedPower += power;
        return addEntryNoTotal(drainType, time, power);
        return addEntryNoTotal(drainType, time, power);
    }
    }


@@ -689,6 +698,8 @@ public class BatteryStatsHelper {


    public double getTotalPower() { return mTotalPower; }
    public double getTotalPower() { return mTotalPower; }


    public double getComputedPower() { return mComputedPower; }

    public double getMinDrainedPower() {
    public double getMinDrainedPower() {
        return mMinDrainedPower;
        return mMinDrainedPower;
    }
    }
Loading