Fix issues in battery usage accounting
1. In High usage dialog, show top apps based on battery usage, not app time. 2. Refactor the check for hidden system modules into ShouldHideSipper, however don't smear it, this is also the current logic before this CL. Bug: 133445008 Test: RunSettingsRoboTests Change-Id: I851a1c9ef9b79a934ba0501cd96001f2e450bda4
This commit is contained in:
@@ -352,15 +352,10 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro
|
||||
|
||||
@VisibleForTesting
|
||||
boolean shouldHideSipper(BatterySipper sipper) {
|
||||
// Don't show hidden system module
|
||||
final String packageName = mBatteryUtils.getPackageName(sipper.getUid());
|
||||
if (!TextUtils.isEmpty(packageName)
|
||||
&& AppUtils.isHiddenSystemModule(mContext, packageName)) {
|
||||
return true;
|
||||
}
|
||||
// Don't show over-counted and unaccounted in any condition
|
||||
// Don't show over-counted, unaccounted and hidden system module in any condition
|
||||
return sipper.drainType == BatterySipper.DrainType.OVERCOUNTED
|
||||
|| sipper.drainType == BatterySipper.DrainType.UNACCOUNTED;
|
||||
|| sipper.drainType == BatterySipper.DrainType.UNACCOUNTED
|
||||
|| mBatteryUtils.isHiddenSystemModule(sipper);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
|
@@ -47,6 +47,7 @@ import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
|
||||
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
|
||||
import com.android.settings.fuelgauge.batterytip.StatsManagerConfig;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.applications.AppUtils;
|
||||
import com.android.settingslib.fuelgauge.Estimate;
|
||||
import com.android.settingslib.fuelgauge.EstimateKt;
|
||||
import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
|
||||
@@ -187,8 +188,10 @@ public class BatteryUtils {
|
||||
&& sipper.drainType != BatterySipper.DrainType.UNACCOUNTED
|
||||
&& sipper.drainType != BatterySipper.DrainType.BLUETOOTH
|
||||
&& sipper.drainType != BatterySipper.DrainType.WIFI
|
||||
&& sipper.drainType != BatterySipper.DrainType.IDLE) {
|
||||
// Don't add it if it is overcounted, unaccounted, wifi, bluetooth, or screen
|
||||
&& sipper.drainType != BatterySipper.DrainType.IDLE
|
||||
&& !isHiddenSystemModule(sipper)) {
|
||||
// Don't add it if it is overcounted, unaccounted, wifi, bluetooth, screen
|
||||
// or hidden system modules
|
||||
proportionalSmearPowerMah += sipper.totalPowerMah;
|
||||
}
|
||||
}
|
||||
@@ -251,7 +254,27 @@ public class BatteryUtils {
|
||||
|| drainType == BatterySipper.DrainType.WIFI
|
||||
|| (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP
|
||||
|| mPowerUsageFeatureProvider.isTypeService(sipper)
|
||||
|| mPowerUsageFeatureProvider.isTypeSystem(sipper);
|
||||
|| mPowerUsageFeatureProvider.isTypeSystem(sipper)
|
||||
|| isHiddenSystemModule(sipper);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return {@code true} if one of packages in {@code sipper} is hidden system modules
|
||||
*/
|
||||
public boolean isHiddenSystemModule(BatterySipper sipper) {
|
||||
if (sipper.uidObj == null) {
|
||||
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 true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -20,7 +20,6 @@ import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.BatteryStats;
|
||||
import android.text.format.DateUtils;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
@@ -72,22 +71,33 @@ public class HighUsageDetector implements BatteryTipDetector {
|
||||
if (mPolicy.highUsageEnabled && mDischarging) {
|
||||
parseBatteryData();
|
||||
if (mDataParser.isDeviceHeavilyUsed() || mPolicy.testHighUsageTip) {
|
||||
final List<BatterySipper> batterySippers = mBatteryStatsHelper.getUsageList();
|
||||
for (int i = 0, size = batterySippers.size(); i < size; i++) {
|
||||
final BatterySipper batterySipper = batterySippers.get(i);
|
||||
if (!mBatteryUtils.shouldHideSipper(batterySipper)) {
|
||||
final long foregroundTimeMs = mBatteryUtils.getProcessTimeMs(
|
||||
BatteryUtils.StatusType.FOREGROUND, batterySipper.uidObj,
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
if (foregroundTimeMs >= DateUtils.MINUTE_IN_MILLIS) {
|
||||
mHighUsageAppList.add(new AppInfo.Builder()
|
||||
.setUid(batterySipper.getUid())
|
||||
.setPackageName(
|
||||
mBatteryUtils.getPackageName(batterySipper.getUid()))
|
||||
.setScreenOnTimeMs(foregroundTimeMs)
|
||||
.build());
|
||||
}
|
||||
final BatteryStats batteryStats = mBatteryStatsHelper.getStats();
|
||||
final List<BatterySipper> batterySippers
|
||||
= new ArrayList<>(mBatteryStatsHelper.getUsageList());
|
||||
final double totalPower = mBatteryStatsHelper.getTotalPower();
|
||||
final int dischargeAmount = batteryStats != null
|
||||
? batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED)
|
||||
: 0;
|
||||
|
||||
Collections.sort(batterySippers,
|
||||
(sipper1, sipper2) -> Double.compare(sipper2.totalSmearedPowerMah,
|
||||
sipper1.totalSmearedPowerMah));
|
||||
for (BatterySipper batterySipper : batterySippers) {
|
||||
final double percent = mBatteryUtils.calculateBatteryPercent(
|
||||
batterySipper.totalSmearedPowerMah, totalPower, 0, dischargeAmount);
|
||||
if ((percent + 0.5f < 1f) || mBatteryUtils.shouldHideSipper(batterySipper)) {
|
||||
// Don't show it if we should hide or usage percentage is lower than 1%
|
||||
continue;
|
||||
}
|
||||
mHighUsageAppList.add(new AppInfo.Builder()
|
||||
.setUid(batterySipper.getUid())
|
||||
.setPackageName(
|
||||
mBatteryUtils.getPackageName(batterySipper.getUid()))
|
||||
.build());
|
||||
if (mHighUsageAppList.size() >= mPolicy.highUsageAppCount) {
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// When in test mode, add an app if necessary
|
||||
@@ -97,10 +107,6 @@ public class HighUsageDetector implements BatteryTipDetector {
|
||||
.setScreenOnTimeMs(TimeUnit.HOURS.toMillis(3))
|
||||
.build());
|
||||
}
|
||||
|
||||
Collections.sort(mHighUsageAppList, Collections.reverseOrder());
|
||||
mHighUsageAppList = mHighUsageAppList.subList(0,
|
||||
Math.min(mPolicy.highUsageAppCount, mHighUsageAppList.size()));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user