diff options
Diffstat (limited to 'core/java')
4 files changed, 99 insertions, 4 deletions
diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index 35a5a7c7c1d0..de7b88575e98 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -20,6 +20,9 @@ import android.annotation.NonNull; import android.util.Range; import android.util.SparseArray; +import com.android.internal.os.BatteryStatsHistory; +import com.android.internal.os.BatteryStatsHistoryIterator; + import java.util.ArrayList; import java.util.List; @@ -37,12 +40,16 @@ public final class BatteryUsageStats implements Parcelable { private final ArrayList<UidBatteryConsumer> mUidBatteryConsumers; private final ArrayList<SystemBatteryConsumer> mSystemBatteryConsumers; private final ArrayList<UserBatteryConsumer> mUserBatteryConsumers; + private final Parcel mHistoryBuffer; + private final List<BatteryStats.HistoryTag> mHistoryTagPool; private BatteryUsageStats(@NonNull Builder builder) { mStatsStartRealtimeMs = builder.mStatsStartRealtimeMs; mDischargePercentage = builder.mDischargePercentage; mDischargedPowerLowerBound = builder.mDischargedPowerLowerBoundMah; mDischargedPowerUpperBound = builder.mDischargedPowerUpperBoundMah; + mHistoryBuffer = builder.mHistoryBuffer; + mHistoryTagPool = builder.mHistoryTagPool; double totalPower = 0; @@ -125,6 +132,19 @@ public final class BatteryUsageStats implements Parcelable { return mUserBatteryConsumers; } + /** + * Returns an iterator for {@link android.os.BatteryStats.HistoryItem}'s. + */ + @NonNull + public BatteryStatsHistoryIterator iterateBatteryStatsHistory() { + if (mHistoryBuffer == null) { + throw new IllegalStateException( + "Battery history was not requested in the BatteryUsageStatsQuery"); + } + return new BatteryStatsHistoryIterator(new BatteryStatsHistory(mHistoryBuffer), + mHistoryTagPool); + } + @Override public int describeContents() { return 0; @@ -142,6 +162,29 @@ public final class BatteryUsageStats implements Parcelable { source.readParcelableList(mSystemBatteryConsumers, getClass().getClassLoader()); mUserBatteryConsumers = new ArrayList<>(); source.readParcelableList(mUserBatteryConsumers, getClass().getClassLoader()); + if (source.readBoolean()) { + mHistoryBuffer = Parcel.obtain(); + mHistoryBuffer.setDataSize(0); + mHistoryBuffer.setDataPosition(0); + + int historyBufferSize = source.readInt(); + int curPos = source.dataPosition(); + mHistoryBuffer.appendFrom(source, curPos, historyBufferSize); + source.setDataPosition(curPos + historyBufferSize); + + int historyTagCount = source.readInt(); + mHistoryTagPool = new ArrayList<>(historyTagCount); + for (int i = 0; i < historyTagCount; i++) { + BatteryStats.HistoryTag tag = new BatteryStats.HistoryTag(); + tag.string = source.readString(); + tag.uid = source.readInt(); + tag.poolIdx = source.readInt(); + mHistoryTagPool.add(tag); + } + } else { + mHistoryBuffer = null; + mHistoryTagPool = null; + } } @Override @@ -154,6 +197,23 @@ public final class BatteryUsageStats implements Parcelable { dest.writeParcelableList(mUidBatteryConsumers, flags); dest.writeParcelableList(mSystemBatteryConsumers, flags); dest.writeParcelableList(mUserBatteryConsumers, flags); + if (mHistoryBuffer != null) { + dest.writeBoolean(true); + + final int historyBufferSize = mHistoryBuffer.dataSize(); + dest.writeInt(historyBufferSize); + dest.appendFrom(mHistoryBuffer, 0, historyBufferSize); + + dest.writeInt(mHistoryTagPool.size()); + for (int i = mHistoryTagPool.size() - 1; i >= 0; i--) { + final BatteryStats.HistoryTag tag = mHistoryTagPool.get(i); + dest.writeString(tag.string); + dest.writeInt(tag.uid); + dest.writeInt(tag.poolIdx); + } + } else { + dest.writeBoolean(false); + } } @NonNull @@ -183,6 +243,8 @@ public final class BatteryUsageStats implements Parcelable { new SparseArray<>(); private final SparseArray<UserBatteryConsumer.Builder> mUserBatteryConsumerBuilders = new SparseArray<>(); + private Parcel mHistoryBuffer; + private List<BatteryStats.HistoryTag> mHistoryTagPool; public Builder(int customPowerComponentCount, int customTimeComponentCount) { mCustomPowerComponentCount = customPowerComponentCount; @@ -227,6 +289,17 @@ public final class BatteryUsageStats implements Parcelable { } /** + * Sets the parceled recent history. + */ + @NonNull + public Builder setBatteryHistory(Parcel historyBuffer, + List<BatteryStats.HistoryTag> historyTagPool) { + mHistoryBuffer = historyBuffer; + mHistoryTagPool = historyTagPool; + return this; + } + + /** * Creates or returns a exiting UidBatteryConsumer, which represents battery attribution * data for an individual UID. */ diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java index 17cb735eea49..9518bf197fa0 100644 --- a/core/java/android/os/BatteryUsageStatsQuery.java +++ b/core/java/android/os/BatteryUsageStatsQuery.java @@ -40,6 +40,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { */ @IntDef(flag = true, prefix = { "FLAG_BATTERY_USAGE_STATS_" }, value = { FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL, + FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY, }) @Retention(RetentionPolicy.SOURCE) public @interface BatteryUsageStatsFlags {} @@ -53,6 +54,12 @@ public final class BatteryUsageStatsQuery implements Parcelable { */ public static final int FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL = 1; + /** + * Indicates that battery history should be included in the BatteryUsageStats. + * @hide + */ + public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY = 2; + private final int mFlags; @NonNull private final int[] mUserIds; @@ -146,10 +153,10 @@ public final class BatteryUsageStatsQuery implements Parcelable { } /** - * Sets flags to modify the behavior of {@link BatteryStatsManager#getBatteryUsageStats}. + * Requests that battery history be included in the BatteryUsageStats. */ - public Builder setFlags(@BatteryUsageStatsFlags int flags) { - mFlags = flags; + public Builder includeBatteryHistory() { + mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY; return this; } diff --git a/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java b/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java index d99af8178feb..1871ac5074c9 100644 --- a/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java +++ b/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java @@ -36,7 +36,7 @@ public class BatteryStatsHistoryIterator { private final String[] mReadHistoryStrings; private final int[] mReadHistoryUids; - BatteryStatsHistoryIterator(@NonNull BatteryStatsHistory history, + public BatteryStatsHistoryIterator(@NonNull BatteryStatsHistory history, @NonNull List<BatteryStats.HistoryTag> historyTagPool) { mBatteryStatsHistory = history; diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index 0163acc295fb..15b584d1fd06 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -30,6 +30,7 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * Uses accumulated battery stats data and PowerCalculators to produce power @@ -152,6 +153,20 @@ public class BatteryUsageStatsProvider { query); } + if ((query.getFlags() + & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY) != 0) { + ArrayList<BatteryStats.HistoryTag> tags = new ArrayList<>( + mStats.mHistoryTagPool.size()); + for (Map.Entry<BatteryStats.HistoryTag, Integer> entry : + mStats.mHistoryTagPool.entrySet()) { + final BatteryStats.HistoryTag tag = entry.getKey(); + tag.poolIdx = entry.getValue(); + tags.add(tag); + } + + batteryUsageStatsBuilder.setBatteryHistory(mStats.mHistoryBuffer, tags); + } + return batteryUsageStatsBuilder.build(); } |
