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);
|
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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user