summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/BatteryStats.java27
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl2
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java16
-rw-r--r--services/core/java/com/android/server/BatteryService.java3
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java7
5 files changed, 45 insertions, 10 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 3d5d900e4b43..7bfc8de705dd 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -24,6 +24,7 @@ import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.function.Predicate;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -1336,9 +1337,11 @@ public abstract class BatteryStats implements Parcelable {
public static final int EVENT_WAKEUP_AP = 0x0013;
// Event for reporting that a specific partial wake lock has been held for a long duration.
public static final int EVENT_LONG_WAKE_LOCK = 0x0014;
+ // Event reporting the new estimated (learned) capacity of the battery in mAh.
+ public static final int EVENT_ESTIMATED_BATTERY_CAP = 0x0015;
// Number of event types.
- public static final int EVENT_COUNT = 0x0015;
+ public static final int EVENT_COUNT = 0x0016;
// Mask to extract out only the type part of the event.
public static final int EVENT_TYPE_MASK = ~(EVENT_FLAG_START|EVENT_FLAG_FINISH);
@@ -2034,13 +2037,28 @@ public abstract class BatteryStats implements Parcelable {
public static final String[] HISTORY_EVENT_NAMES = new String[] {
"null", "proc", "fg", "top", "sync", "wake_lock_in", "job", "user", "userfg", "conn",
"active", "pkginst", "pkgunin", "alarm", "stats", "inactive", "active", "tmpwhitelist",
- "screenwake", "wakeupap", "longwake"
+ "screenwake", "wakeupap", "longwake", "est_capacity"
};
public static final String[] HISTORY_EVENT_CHECKIN_NAMES = new String[] {
"Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn",
"Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa", "Etw",
- "Esw", "Ewa", "Elw"
+ "Esw", "Ewa", "Elw", "Eec"
+ };
+
+ @FunctionalInterface
+ public interface IntToString {
+ String applyAsString(int val);
+ }
+
+ private static final IntToString sUidToString = UserHandle::formatUid;
+ private static final IntToString sIntToString = Integer::toString;
+
+ public static final IntToString[] HISTORY_EVENT_INT_FORMATTERS = new IntToString[] {
+ sUidToString, sUidToString, sUidToString, sUidToString, sUidToString, sUidToString,
+ sUidToString, sUidToString, sUidToString, sUidToString, sUidToString, sUidToString,
+ sUidToString, sUidToString, sUidToString, sUidToString, sUidToString, sUidToString,
+ sUidToString, sUidToString, sUidToString, sIntToString
};
/**
@@ -4958,7 +4976,8 @@ public abstract class BatteryStats implements Parcelable {
if (checkin) {
pw.print(rec.eventTag.poolIdx);
} else {
- UserHandle.formatUid(pw, rec.eventTag.uid);
+ pw.append(HISTORY_EVENT_INT_FORMATTERS[idx]
+ .applyAsString(rec.eventTag.uid));
pw.print(":\"");
pw.print(rec.eventTag.string);
pw.print("\"");
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 5623a2cb430c..99a25fd8526b 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -125,7 +125,7 @@ interface IBatteryStats {
void noteNetworkStatsEnabled();
void noteDeviceIdleMode(int mode, String activeReason, int activeUid);
void setBatteryState(int status, int health, int plugType, int level, int temp, int volt,
- int chargeUAh);
+ int chargeUAh, int chargeFullUAh);
long getAwakeTimeBattery();
long getAwakeTimePlugged();
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index b60e6b5ee3c1..460e5ff1959b 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -559,6 +559,10 @@ public class BatteryStatsImpl extends BatteryStats {
private int mEstimatedBatteryCapacity = -1;
+ // Last learned capacity reported by BatteryService in
+ // setBatteryState().
+ private int mLastChargeFullUAh = 0;
+
private final NetworkStats.Entry mTmpNetworkStatsEntry = new NetworkStats.Entry();
private PowerProfile mPowerProfile;
@@ -9757,7 +9761,7 @@ public class BatteryStatsImpl extends BatteryStats {
public static final int BATTERY_PLUGGED_NONE = 0;
public void setBatteryStateLocked(int status, int health, int plugType, int level,
- int temp, int volt, int chargeUAh) {
+ int temp, int volt, int chargeUAh, int chargeFullUAh) {
final boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
final long uptime = mClocks.uptimeMillis();
final long elapsedRealtime = mClocks.elapsedRealtime();
@@ -9919,6 +9923,16 @@ public class BatteryStatsImpl extends BatteryStats {
// The next time we are unplugged, history will be cleared.
mRecordingHistory = DEBUG;
}
+
+ if (differsByMoreThan(chargeFullUAh, mLastChargeFullUAh, 100)) {
+ mLastChargeFullUAh = chargeFullUAh;
+ addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ESTIMATED_BATTERY_CAP,
+ "", chargeFullUAh / 1000);
+ }
+ }
+
+ private static boolean differsByMoreThan(int left, int right, int diff) {
+ return Math.abs(left - right) > diff;
}
public long getAwakeTimeBattery() {
diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java
index 38c6fb61fa4e..dd550f22f992 100644
--- a/services/core/java/com/android/server/BatteryService.java
+++ b/services/core/java/com/android/server/BatteryService.java
@@ -364,7 +364,8 @@ public final class BatteryService extends SystemService {
try {
mBatteryStats.setBatteryState(mBatteryProps.batteryStatus, mBatteryProps.batteryHealth,
mPlugType, mBatteryProps.batteryLevel, mBatteryProps.batteryTemperature,
- mBatteryProps.batteryVoltage, mBatteryProps.batteryChargeCounter);
+ mBatteryProps.batteryVoltage, mBatteryProps.batteryChargeCounter,
+ mBatteryProps.batteryFullCharge);
} catch (RemoteException e) {
// Should never happen.
}
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 0ea78b3e9e83..f1f8bb20652d 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -991,7 +991,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
@Override
public void setBatteryState(final int status, final int health, final int plugType,
- final int level, final int temp, final int volt, final int chargeUAh) {
+ final int level, final int temp, final int volt, final int chargeUAh,
+ final int chargeFullUAh) {
enforceCallingPermission();
// BatteryService calls us here and we may update external state. It would be wrong
@@ -1005,7 +1006,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
// The battery state has not changed, so we don't need to sync external
// stats immediately.
mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
- chargeUAh);
+ chargeUAh, chargeFullUAh);
return;
}
}
@@ -1015,7 +1016,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
updateExternalStatsSync("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
synchronized (mStats) {
mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
- chargeUAh);
+ chargeUAh, chargeFullUAh);
}
}
});