Transition BatteryAppListPreferences to BatteryUsageStats API

Bug: 173745486
Test: make RunSettingsRoboTests
Test: male RunSettingsGoogleRoboTests

Change-Id: I7af8cbcd27433b89cb2184750c6854aa74761d0d
This commit is contained in:
Dmitri Plotnikov
2021-03-08 20:11:54 -08:00
parent dba51aa233
commit 036dc189b6
13 changed files with 574 additions and 675 deletions

View File

@@ -30,7 +30,9 @@ import android.os.BatteryUsageStatsQuery;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
@@ -59,8 +61,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.time.Duration;
import java.time.Instant;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
@@ -86,6 +86,7 @@ public class BatteryUtils {
private static final String TAG = "BatteryUtils";
private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5;
private static final double MIN_POWER_THRESHOLD_MILLI_AMP_HOURS = 0.002;
private static final int SECONDS_IN_HOUR = 60 * 60;
private static BatteryUtils sInstance;
@@ -171,21 +172,6 @@ public class BatteryUtils {
+ PowerUtil.convertUsToMs(getForegroundServiceTotalTimeUs(uid, rawRealTimeUs));
}
/**
* Remove the {@link BatterySipper} that we should hide.
*
* @param sippers sipper list that need to check and remove
* for proportional smearing
*/
public void removeHiddenBatterySippers(List<BatterySipper> sippers) {
for (int i = sippers.size() - 1; i >= 0; i--) {
final BatterySipper sipper = sippers.get(i);
if (shouldHideSipper(sipper)) {
sippers.remove(i);
}
}
}
/**
* Check whether we should hide the battery sipper.
*/
@@ -205,6 +191,42 @@ public class BatteryUtils {
|| isHiddenSystemModule(sipper);
}
/**
* Returns true if the specified battery consumer should be excluded from the summary
* battery consumption list.
*/
public boolean shouldHideUidBatteryConsumer(UidBatteryConsumer consumer, String[] packages) {
return consumer.getConsumedPower() < MIN_POWER_THRESHOLD_MILLI_AMP_HOURS
|| mPowerUsageFeatureProvider.isTypeSystem(consumer.getUid(), packages)
|| shouldHideUidBatteryConsumerUnconditionally(consumer, packages);
}
/**
* Returns true if the specified battery consumer should be excluded from
* battery consumption lists, either short or full.
*/
boolean shouldHideUidBatteryConsumerUnconditionally(UidBatteryConsumer consumer,
String[] packages) {
return consumer.getUid() < 0 || isHiddenSystemModule(packages);
}
/**
* Returns true if the specified battery consumer should be excluded from the summary
* battery consumption list.
*/
public boolean shouldHideSystemBatteryConsumer(SystemBatteryConsumer consumer) {
switch (consumer.getDrainType()) {
case SystemBatteryConsumer.DRAIN_TYPE_IDLE:
case SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO:
case SystemBatteryConsumer.DRAIN_TYPE_SCREEN:
case SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH:
case SystemBatteryConsumer.DRAIN_TYPE_WIFI:
return true;
default:
return consumer.getConsumedPower() < MIN_POWER_THRESHOLD_MILLI_AMP_HOURS;
}
}
/**
* Return {@code true} if one of packages in {@code sipper} is hidden system modules
*/
@@ -213,14 +235,20 @@ public class BatteryUtils {
return false;
}
sipper.mPackages = mPackageManager.getPackagesForUid(sipper.getUid());
if (sipper.mPackages != null) {
for (int i = 0, length = sipper.mPackages.length; i < length; i++) {
if (AppUtils.isHiddenSystemModule(mContext, sipper.mPackages[i])) {
return isHiddenSystemModule(sipper.mPackages);
}
/**
* Returns true if one the specified packages belongs to a hidden system module.
*/
public boolean isHiddenSystemModule(String[] packages) {
if (packages != null) {
for (int i = 0, length = packages.length; i < length; i++) {
if (AppUtils.isHiddenSystemModule(mContext, packages[i])) {
return true;
}
}
}
return false;
}
@@ -305,18 +333,6 @@ public class BatteryUtils {
return mode == AppOpsManager.MODE_IGNORED || mode == AppOpsManager.MODE_ERRORED;
}
/**
* Sort the {@code usageList} based on {@link BatterySipper#totalPowerMah}
*/
public void sortUsageList(List<BatterySipper> usageList) {
Collections.sort(usageList, new Comparator<BatterySipper>() {
@Override
public int compare(BatterySipper a, BatterySipper b) {
return Double.compare(b.totalPowerMah, a.totalPowerMah);
}
});
}
/**
* Calculate the time since last full charge, including the device off time
*
@@ -330,18 +346,6 @@ public class BatteryUtils {
}
/**
* Calculate the screen usage time since last full charge.
*
* @param batteryStatsHelper utility class that contains the screen usage data
* @return time in millis
*/
public long calculateScreenUsageTime(BatteryStatsHelper batteryStatsHelper) {
final BatterySipper sipper = findBatterySipperByType(
batteryStatsHelper.getUsageList(), BatterySipper.DrainType.SCREEN);
return sipper != null ? sipper.usageTimeMs : 0;
}
public static void logRuntime(String tag, String message, long startTime) {
Log.d(tag, message + ": " + (System.currentTimeMillis() - startTime) + "ms");
}
@@ -466,20 +470,6 @@ public class BatteryUtils {
return estimate;
}
/**
* Find the {@link BatterySipper} with the corresponding {@link BatterySipper.DrainType}
*/
public BatterySipper findBatterySipperByType(List<BatterySipper> usageList,
BatterySipper.DrainType type) {
for (int i = 0, size = usageList.size(); i < size; i++) {
final BatterySipper sipper = usageList.get(i);
if (sipper.drainType == type) {
return sipper;
}
}
return null;
}
private boolean isDataCorrupted() {
return mPackageManager == null || mAppOpsManager == null;
}
@@ -614,4 +604,3 @@ public class BatteryUtils {
return -1L;
}
}