Update the method about foreground time.

For now it uses MIN(STATE_TOP_TIME, FOREGROUND_ACTIVITY_TIME) and this
method is used in both display and screen smearing.

Bug: 63080621
Test: RunSettingsRoboTests
Change-Id: I2ca3109697aa66fae67d8b2f4f10c4d08bb99d59
This commit is contained in:
jackqdyulei
2017-06-30 10:18:34 -07:00
parent 2354fae941
commit 43cbee6914
3 changed files with 29 additions and 21 deletions

View File

@@ -122,7 +122,10 @@ public class BatteryUtils {
} }
Log.v(TAG, "foreground time(us): " + timeUs); Log.v(TAG, "foreground time(us): " + timeUs);
return convertUsToMs(timeUs); // Return the min value of STATE_TOP time and foreground activity time, since both of these
// time have some errors.
return convertUsToMs(
Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs)));
} }
/** /**
@@ -167,15 +170,13 @@ public class BatteryUtils {
*/ */
@VisibleForTesting @VisibleForTesting
void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper) { void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper) {
final long rawRealtimeMs = SystemClock.elapsedRealtime();
long totalActivityTimeMs = 0; long totalActivityTimeMs = 0;
final SparseLongArray activityTimeArray = new SparseLongArray(); final SparseLongArray activityTimeArray = new SparseLongArray();
for (int i = 0, size = sippers.size(); i < size; i++) { for (int i = 0, size = sippers.size(); i < size; i++) {
final BatteryStats.Uid uid = sippers.get(i).uidObj; final BatteryStats.Uid uid = sippers.get(i).uidObj;
if (uid != null) { if (uid != null) {
final long timeMs = Math.min(getForegroundActivityTotalTimeMs(uid, rawRealtimeMs), final long timeMs = getProcessTimeMs(StatusType.FOREGROUND, uid,
getProcessTimeMs(StatusType.FOREGROUND, uid, BatteryStats.STATS_SINCE_CHARGED);
BatteryStats.STATS_SINCE_CHARGED));
activityTimeArray.put(uid.getUid(), timeMs); activityTimeArray.put(uid.getUid(), timeMs);
totalActivityTimeMs += timeMs; totalActivityTimeMs += timeMs;
} }
@@ -328,11 +329,10 @@ public class BatteryUtils {
} }
@VisibleForTesting @VisibleForTesting
long getForegroundActivityTotalTimeMs(BatteryStats.Uid uid, long rawRealtimeMs) { long getForegroundActivityTotalTimeUs(BatteryStats.Uid uid, long rawRealtimeUs) {
final BatteryStats.Timer timer = uid.getForegroundActivityTimer(); final BatteryStats.Timer timer = uid.getForegroundActivityTimer();
if (timer != null) { if (timer != null) {
return convertUsToMs(timer.getTotalTimeLocked(convertMsToUs(rawRealtimeMs), return timer.getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
BatteryStats.STATS_SINCE_CHARGED));
} }
return 0; return 0;

View File

@@ -119,6 +119,8 @@ public class AdvancedPowerUsageDetailTest {
private LoaderManager mLoaderManager; private LoaderManager mLoaderManager;
@Mock @Mock
private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController; private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
@Mock
private BatteryStats.Timer mTimer;
private Context mContext; private Context mContext;
private Preference mForegroundPreference; private Preference mForegroundPreference;
private Preference mBackgroundPreference; private Preference mBackgroundPreference;
@@ -168,6 +170,8 @@ public class AdvancedPowerUsageDetailTest {
eq(BatteryStats.Uid.PROCESS_STATE_BACKGROUND), anyLong(), anyInt()); eq(BatteryStats.Uid.PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
doReturn(FOREGROUND_TIME_US).when(mUid).getProcessStateTime( doReturn(FOREGROUND_TIME_US).when(mUid).getProcessStateTime(
eq(BatteryStats.Uid.PROCESS_STATE_TOP), anyLong(), anyInt()); eq(BatteryStats.Uid.PROCESS_STATE_TOP), anyLong(), anyInt());
doReturn(mTimer).when(mUid).getForegroundActivityTimer();
doReturn(FOREGROUND_TIME_US).when(mTimer).getTotalTimeLocked(anyLong(), anyInt());
ReflectionHelpers.setField(mBatteryEntry, "sipper", mBatterySipper); ReflectionHelpers.setField(mBatteryEntry, "sipper", mBatterySipper);
mBatteryEntry.iconId = ICON_ID; mBatteryEntry.iconId = ICON_ID;
mBatterySipper.uidObj = mUid; mBatterySipper.uidObj = mUid;

View File

@@ -178,6 +178,9 @@ public class BatteryUtilsTest {
@Test @Test
public void testGetProcessTimeMs_typeForeground_timeCorrect() { public void testGetProcessTimeMs_typeForeground_timeCorrect() {
doReturn(TIME_STATE_FOREGROUND + 500).when(mBatteryUtils).getForegroundActivityTotalTimeUs(
eq(mUid), anyLong());
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid, final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid,
BatteryStats.STATS_SINCE_CHARGED); BatteryStats.STATS_SINCE_CHARGED);
@@ -194,6 +197,9 @@ public class BatteryUtilsTest {
@Test @Test
public void testGetProcessTimeMs_typeAll_timeCorrect() { public void testGetProcessTimeMs_typeAll_timeCorrect() {
doReturn(TIME_STATE_FOREGROUND + 500).when(mBatteryUtils).getForegroundActivityTotalTimeUs(
eq(mUid), anyLong());
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid, final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid,
BatteryStats.STATS_SINCE_CHARGED); BatteryStats.STATS_SINCE_CHARGED);
@@ -305,13 +311,13 @@ public class BatteryUtilsTest {
@Test @Test
public void testSmearScreenBatterySipper() { public void testSmearScreenBatterySipper() {
final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO, final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO,
TIME_FOREGROUND_ZERO + 500, BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */); BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */);
final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO + 100, final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO,
TIME_FOREGROUND_ZERO, BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */); BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */);
final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND, final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND,
TIME_FOREGROUND + 200, BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */); BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */);
final BatterySipper sipperFg2 = createTestSmearBatterySipper(TIME_FOREGROUND + 600, final BatterySipper sipperFg2 = createTestSmearBatterySipper(TIME_FOREGROUND,
TIME_FOREGROUND, BATTERY_APP_USAGE, 3 /* uid */, false /* isUidNull */); BATTERY_APP_USAGE, 3 /* uid */, false /* isUidNull */);
final List<BatterySipper> sippers = new ArrayList<>(); final List<BatterySipper> sippers = new ArrayList<>();
sippers.add(sipperNull); sippers.add(sipperNull);
@@ -370,16 +376,16 @@ public class BatteryUtilsTest {
@Test @Test
public void testGetForegroundActivityTotalTimeMs_returnMilliseconds() { public void testGetForegroundActivityTotalTimeMs_returnMilliseconds() {
final long rawRealtimeMs = SystemClock.elapsedRealtime(); final long rawRealtimeUs = SystemClock.elapsedRealtime() * 1000;
doReturn(mTimer).when(mUid).getForegroundActivityTimer(); doReturn(mTimer).when(mUid).getForegroundActivityTimer();
doReturn(TIME_SINCE_LAST_FULL_CHARGE_US).when(mTimer) doReturn(TIME_SINCE_LAST_FULL_CHARGE_US).when(mTimer)
.getTotalTimeLocked(rawRealtimeMs * 1000, BatteryStats.STATS_SINCE_CHARGED); .getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
assertThat(mBatteryUtils.getForegroundActivityTotalTimeMs(mUid, rawRealtimeMs)).isEqualTo( assertThat(mBatteryUtils.getForegroundActivityTotalTimeUs(mUid, rawRealtimeUs)).isEqualTo(
TIME_SINCE_LAST_FULL_CHARGE_MS); TIME_SINCE_LAST_FULL_CHARGE_US);
} }
private BatterySipper createTestSmearBatterySipper(long activityTime, long topTime, private BatterySipper createTestSmearBatterySipper(long topTime,
double totalPowerMah, int uidCode, boolean isUidNull) { double totalPowerMah, int uidCode, boolean isUidNull) {
final BatterySipper sipper = mock(BatterySipper.class); final BatterySipper sipper = mock(BatterySipper.class);
sipper.drainType = BatterySipper.DrainType.APP; sipper.drainType = BatterySipper.DrainType.APP;
@@ -387,8 +393,6 @@ public class BatteryUtilsTest {
doReturn(uidCode).when(sipper).getUid(); doReturn(uidCode).when(sipper).getUid();
if (!isUidNull) { if (!isUidNull) {
final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS); final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS);
doReturn(activityTime).when(mBatteryUtils).getForegroundActivityTotalTimeMs(eq(uid),
anyLong());
doReturn(topTime).when(mBatteryUtils).getProcessTimeMs( doReturn(topTime).when(mBatteryUtils).getProcessTimeMs(
eq(BatteryUtils.StatusType.FOREGROUND), eq(uid), anyInt()); eq(BatteryUtils.StatusType.FOREGROUND), eq(uid), anyInt());
doReturn(uidCode).when(uid).getUid(); doReturn(uidCode).when(uid).getUid();