From ef48c131c73a35659375283b40f3343390b7b14a Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Wed, 8 Feb 2017 16:01:13 -0800 Subject: [PATCH] Distribute all the hidden items to apps 1. Add screen check in the shouldHideSipper() 2. remove all the battery usage for hiddenSipper from percentage calculation, in this way we can distribute hidden sippers to all the apps Bug: 35153599 Test: RunSettingsRoboTests Change-Id: I82673b282c14c92269d7f8bc71e07de90a37720c --- .../settings/fuelgauge/PowerUsageSummary.java | 27 +++++++------- .../fuelgauge/PowerUsageSummaryTest.java | 36 ++++++++++++------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index c0c92f095e0..309830b9b8f 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -344,23 +344,20 @@ public class PowerUsageSummary extends PowerUsageBase { final List usageList = getCoalescedUsageList( USE_FAKE_DATA ? getFakeStats() : mStatsHelper.getUsageList()); - final double screenPowerMah = removeScreenBatterySipper(usageList); + final double hiddenPowerMah = removeHiddenBatterySippers(usageList); final int dischargeAmount = USE_FAKE_DATA ? 5000 : stats != null ? stats.getDischargeAmount(mStatsType) : 0; final int numSippers = usageList.size(); for (int i = 0; i < numSippers; i++) { final BatterySipper sipper = usageList.get(i); - if (shouldHideSipper(sipper)) { - continue; - } - - // Deduct the screen power from total power, used to calculate percentOfTotal + // Deduct the power of hidden items from total power, which is used to + // calculate percentOfTotal double totalPower = USE_FAKE_DATA ? - 4000 : mStatsHelper.getTotalPower() - screenPowerMah; + 4000 : mStatsHelper.getTotalPower() - hiddenPowerMah; // With deduction in totalPower, percentOfTotal is higher because it adds the part - // used in screen + // used in screen, system, etc final double percentOfTotal = ((sipper.totalPowerMah / totalPower) * dischargeAmount); @@ -451,7 +448,8 @@ public class PowerUsageSummary extends PowerUsageBase { final int uid = sipper.getUid(); return drainType == DrainType.IDLE || drainType == DrainType.CELL - || uid == Process.ROOT_UID || uid == Process.SYSTEM_UID + || drainType == DrainType.SCREEN || uid == Process.ROOT_UID + || uid == Process.SYSTEM_UID || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP; } @@ -470,16 +468,17 @@ public class PowerUsageSummary extends PowerUsageBase { } @VisibleForTesting - double removeScreenBatterySipper(List sippers) { - for (int i = 0, size = sippers.size(); i < size; i++) { + double removeHiddenBatterySippers(List sippers) { + double totalPowerMah = 0; + for (int i = sippers.size() - 1; i >= 0; i--) { final BatterySipper sipper = sippers.get(i); - if (sipper.drainType == DrainType.SCREEN) { + if (shouldHideSipper(sipper)) { sippers.remove(i); - return sipper.totalPowerMah; + totalPowerMah += sipper.totalPowerMah; } } - return 0; + return totalPowerMah; } private static List getFakeStats() { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java index 63cb5e1bdbb..60e1f5064f8 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java @@ -44,7 +44,6 @@ import static com.android.settings.fuelgauge.PowerUsageBase.MENU_STATS_REFRESH; import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_ADDITIONAL_BATTERY_INFO; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -61,6 +60,7 @@ public class PowerUsageSummaryTest { private static final int UID = 123; private static final int POWER_MAH = 100; private static final double BATTERY_SCREEN_USAGE = 300; + private static final double BATTERY_SYSTEM_USAGE = 600; private static final double PRECISION = 0.001; private static final Intent ADDITIONAL_BATTERY_INFO_INTENT = new Intent("com.example.app.ADDITIONAL_BATTERY_INFO"); @@ -80,6 +80,8 @@ public class PowerUsageSummaryTest { @Mock private BatterySipper mScreenBatterySipper; @Mock + private BatterySipper mSystemBatterySipper; + @Mock private PowerGaugePreference mPreference; private TestFragment mFragment; @@ -114,6 +116,9 @@ public class PowerUsageSummaryTest { mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN; mScreenBatterySipper.totalPowerMah = BATTERY_SCREEN_USAGE; + mSystemBatterySipper.drainType = BatterySipper.DrainType.APP; + mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE; + when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID); } @Test @@ -161,17 +166,6 @@ public class PowerUsageSummaryTest { assertThat(key).isEqualTo(mNormalBatterySipper.drainType.toString()); } - @Test - public void testRemoveScreenBatterySipper_ContainsScreenSipper_RemoveAndReturnValue() { - final List sippers = new ArrayList<>(); - sippers.add(mNormalBatterySipper); - sippers.add(mScreenBatterySipper); - - final double screenUsage = mPowerUsageSummary.removeScreenBatterySipper(sippers); - assertThat(sippers).containsExactly(mNormalBatterySipper); - assertThat(screenUsage).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE); - } - @Test public void testExtractKeyFromSipper_TypeAPPUidObjectNotNull_ReturnUid() { mNormalBatterySipper.uidObj = new BatteryStatsImpl.Uid(new BatteryStatsImpl(), UID); @@ -181,6 +175,18 @@ public class PowerUsageSummaryTest { assertThat(key).isEqualTo(Integer.toString(mNormalBatterySipper.getUid())); } + @Test + public void testRemoveHiddenBatterySippers_ContainsHiddenSippers_RemoveAndReturnValue() { + final List sippers = new ArrayList<>(); + sippers.add(mNormalBatterySipper); + sippers.add(mScreenBatterySipper); + sippers.add(mSystemBatterySipper); + + final double totalUsage = mPowerUsageSummary.removeHiddenBatterySippers(sippers); + assertThat(sippers).containsExactly(mNormalBatterySipper); + assertThat(totalUsage).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE + BATTERY_SYSTEM_USAGE); + } + @Test public void testShouldHideSipper_TypeIdle_ReturnTrue() { mNormalBatterySipper.drainType = BatterySipper.DrainType.IDLE; @@ -193,6 +199,12 @@ public class PowerUsageSummaryTest { assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue(); } + @Test + public void testShouldHideSipper_TypeScreen_ReturnTrue() { + mNormalBatterySipper.drainType = BatterySipper.DrainType.SCREEN; + assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue(); + } + @Test public void testShouldHideSipper_UidRoot_ReturnTrue() { mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;