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:
@@ -122,7 +122,10 @@ public class BatteryUtils {
|
||||
}
|
||||
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
|
||||
void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper) {
|
||||
final long rawRealtimeMs = SystemClock.elapsedRealtime();
|
||||
long totalActivityTimeMs = 0;
|
||||
final SparseLongArray activityTimeArray = new SparseLongArray();
|
||||
for (int i = 0, size = sippers.size(); i < size; i++) {
|
||||
final BatteryStats.Uid uid = sippers.get(i).uidObj;
|
||||
if (uid != null) {
|
||||
final long timeMs = Math.min(getForegroundActivityTotalTimeMs(uid, rawRealtimeMs),
|
||||
getProcessTimeMs(StatusType.FOREGROUND, uid,
|
||||
BatteryStats.STATS_SINCE_CHARGED));
|
||||
final long timeMs = getProcessTimeMs(StatusType.FOREGROUND, uid,
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
activityTimeArray.put(uid.getUid(), timeMs);
|
||||
totalActivityTimeMs += timeMs;
|
||||
}
|
||||
@@ -328,11 +329,10 @@ public class BatteryUtils {
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
long getForegroundActivityTotalTimeMs(BatteryStats.Uid uid, long rawRealtimeMs) {
|
||||
long getForegroundActivityTotalTimeUs(BatteryStats.Uid uid, long rawRealtimeUs) {
|
||||
final BatteryStats.Timer timer = uid.getForegroundActivityTimer();
|
||||
if (timer != null) {
|
||||
return convertUsToMs(timer.getTotalTimeLocked(convertMsToUs(rawRealtimeMs),
|
||||
BatteryStats.STATS_SINCE_CHARGED));
|
||||
return timer.getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -119,6 +119,8 @@ public class AdvancedPowerUsageDetailTest {
|
||||
private LoaderManager mLoaderManager;
|
||||
@Mock
|
||||
private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
|
||||
@Mock
|
||||
private BatteryStats.Timer mTimer;
|
||||
private Context mContext;
|
||||
private Preference mForegroundPreference;
|
||||
private Preference mBackgroundPreference;
|
||||
@@ -168,6 +170,8 @@ public class AdvancedPowerUsageDetailTest {
|
||||
eq(BatteryStats.Uid.PROCESS_STATE_BACKGROUND), anyLong(), anyInt());
|
||||
doReturn(FOREGROUND_TIME_US).when(mUid).getProcessStateTime(
|
||||
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);
|
||||
mBatteryEntry.iconId = ICON_ID;
|
||||
mBatterySipper.uidObj = mUid;
|
||||
|
@@ -178,6 +178,9 @@ public class BatteryUtilsTest {
|
||||
|
||||
@Test
|
||||
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,
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
|
||||
@@ -194,6 +197,9 @@ public class BatteryUtilsTest {
|
||||
|
||||
@Test
|
||||
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,
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
|
||||
@@ -305,13 +311,13 @@ public class BatteryUtilsTest {
|
||||
@Test
|
||||
public void testSmearScreenBatterySipper() {
|
||||
final BatterySipper sipperNull = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO,
|
||||
TIME_FOREGROUND_ZERO + 500, BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */);
|
||||
final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO + 100,
|
||||
TIME_FOREGROUND_ZERO, BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */);
|
||||
BATTERY_APP_USAGE, 0 /* uid */, true /* isUidNull */);
|
||||
final BatterySipper sipperBg = createTestSmearBatterySipper(TIME_FOREGROUND_ZERO,
|
||||
BATTERY_APP_USAGE, 1 /* uid */, false /* isUidNull */);
|
||||
final BatterySipper sipperFg = createTestSmearBatterySipper(TIME_FOREGROUND,
|
||||
TIME_FOREGROUND + 200, BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */);
|
||||
final BatterySipper sipperFg2 = createTestSmearBatterySipper(TIME_FOREGROUND + 600,
|
||||
TIME_FOREGROUND, BATTERY_APP_USAGE, 3 /* uid */, false /* isUidNull */);
|
||||
BATTERY_APP_USAGE, 2 /* uid */, false /* isUidNull */);
|
||||
final BatterySipper sipperFg2 = createTestSmearBatterySipper(TIME_FOREGROUND,
|
||||
BATTERY_APP_USAGE, 3 /* uid */, false /* isUidNull */);
|
||||
|
||||
final List<BatterySipper> sippers = new ArrayList<>();
|
||||
sippers.add(sipperNull);
|
||||
@@ -370,16 +376,16 @@ public class BatteryUtilsTest {
|
||||
|
||||
@Test
|
||||
public void testGetForegroundActivityTotalTimeMs_returnMilliseconds() {
|
||||
final long rawRealtimeMs = SystemClock.elapsedRealtime();
|
||||
final long rawRealtimeUs = SystemClock.elapsedRealtime() * 1000;
|
||||
doReturn(mTimer).when(mUid).getForegroundActivityTimer();
|
||||
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(
|
||||
TIME_SINCE_LAST_FULL_CHARGE_MS);
|
||||
assertThat(mBatteryUtils.getForegroundActivityTotalTimeUs(mUid, rawRealtimeUs)).isEqualTo(
|
||||
TIME_SINCE_LAST_FULL_CHARGE_US);
|
||||
}
|
||||
|
||||
private BatterySipper createTestSmearBatterySipper(long activityTime, long topTime,
|
||||
private BatterySipper createTestSmearBatterySipper(long topTime,
|
||||
double totalPowerMah, int uidCode, boolean isUidNull) {
|
||||
final BatterySipper sipper = mock(BatterySipper.class);
|
||||
sipper.drainType = BatterySipper.DrainType.APP;
|
||||
@@ -387,8 +393,6 @@ public class BatteryUtilsTest {
|
||||
doReturn(uidCode).when(sipper).getUid();
|
||||
if (!isUidNull) {
|
||||
final BatteryStats.Uid uid = mock(BatteryStats.Uid.class, RETURNS_DEEP_STUBS);
|
||||
doReturn(activityTime).when(mBatteryUtils).getForegroundActivityTotalTimeMs(eq(uid),
|
||||
anyLong());
|
||||
doReturn(topTime).when(mBatteryUtils).getProcessTimeMs(
|
||||
eq(BatteryUtils.StatusType.FOREGROUND), eq(uid), anyInt());
|
||||
doReturn(uidCode).when(uid).getUid();
|
||||
|
Reference in New Issue
Block a user