Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1b27bfa authored by jackqdyulei's avatar jackqdyulei Committed by android-build-merger
Browse files

Merge "Update the smearing methods in framework." into oc-dr1-dev am: 386d8133

am: 8f386f6e

Change-Id: Id2162eb0711c47ce072c129afdf239c736f4c138
parents f5d3eede 8f386f6e
Loading
Loading
Loading
Loading
+34 −6
Original line number Original line Diff line number Diff line
@@ -840,7 +840,10 @@ public class BatteryStatsHelper {
            if (sipper.shouldHide) {
            if (sipper.shouldHide) {
                if (sipper.drainType != BatterySipper.DrainType.OVERCOUNTED
                if (sipper.drainType != BatterySipper.DrainType.OVERCOUNTED
                        && sipper.drainType != BatterySipper.DrainType.SCREEN
                        && sipper.drainType != BatterySipper.DrainType.SCREEN
                        && sipper.drainType != BatterySipper.DrainType.UNACCOUNTED) {
                        && 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 or screen
                    // Don't add it if it is overcounted, unaccounted or screen
                    proportionalSmearPowerMah += sipper.totalPowerMah;
                    proportionalSmearPowerMah += sipper.totalPowerMah;
                }
                }
@@ -861,19 +864,19 @@ public class BatteryStatsHelper {
     * time.
     * time.
     */
     */
    public void smearScreenBatterySipper(List<BatterySipper> sippers, BatterySipper screenSipper) {
    public 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 = getForegroundActivityTotalTimeMs(uid, rawRealtimeMs);
                final long timeMs = getProcessForegroundTimeMs(uid,
                        BatteryStats.STATS_SINCE_CHARGED);
                activityTimeArray.put(uid.getUid(), timeMs);
                activityTimeArray.put(uid.getUid(), timeMs);
                totalActivityTimeMs += timeMs;
                totalActivityTimeMs += timeMs;
            }
            }
        }
        }


        if (totalActivityTimeMs >= 10 * DateUtils.MINUTE_IN_MILLIS) {
        if (screenSipper != null && totalActivityTimeMs >= 10 * DateUtils.MINUTE_IN_MILLIS) {
            final double screenPowerMah = screenSipper.totalPowerMah;
            final double screenPowerMah = screenSipper.totalPowerMah;
            for (int i = 0, size = sippers.size(); i < size; i++) {
            for (int i = 0, size = sippers.size(); i < size; i++) {
                final BatterySipper sipper = sippers.get(i);
                final BatterySipper sipper = sippers.get(i);
@@ -936,16 +939,41 @@ public class BatteryStatsHelper {
        return false;
        return false;
    }
    }


    public long convertUsToMs(long timeUs) {
        return timeUs / 1000;
    }

    public long convertMsToUs(long timeMs) {
        return timeMs * 1000;
    }

    @VisibleForTesting
    @VisibleForTesting
    public long getForegroundActivityTotalTimeMs(BatteryStats.Uid uid, long rawRealtimeMs) {
    public 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 timer.getTotalTimeLocked(rawRealtimeMs, BatteryStats.STATS_SINCE_CHARGED);
            return timer.getTotalTimeLocked(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED);
        }
        }


        return 0;
        return 0;
    }
    }


    @VisibleForTesting
    public long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
        final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
        final int foregroundTypes[] = {BatteryStats.Uid.PROCESS_STATE_TOP};

        long timeUs = 0;
        for (int type : foregroundTypes) {
            final long localTime = uid.getProcessStateTime(type, rawRealTimeUs, which);
            timeUs += localTime;
        }

        // 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)));
    }

    @VisibleForTesting
    @VisibleForTesting
    public void setPackageManager(PackageManager packageManager) {
    public void setPackageManager(PackageManager packageManager) {
        mPackageManager = packageManager;
        mPackageManager = packageManager;
+42 −4
Original line number Original line Diff line number Diff line
@@ -18,9 +18,12 @@
package com.android.internal.os;
package com.android.internal.os;




import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP;

import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertThat;


import static org.mockito.Matchers.any;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -54,11 +57,16 @@ import java.util.List;
@SmallTest
@SmallTest
public class BatteryStatsHelperTest extends TestCase {
public class BatteryStatsHelperTest extends TestCase {
    private static final long TIME_FOREGROUND_ACTIVITY_ZERO = 0;
    private static final long TIME_FOREGROUND_ACTIVITY_ZERO = 0;
    private static final long TIME_FOREGROUND_ACTIVITY = 100 * DateUtils.MINUTE_IN_MILLIS;
    private static final long TIME_FOREGROUND_ACTIVITY = 100 * DateUtils.MINUTE_IN_MILLIS * 1000;
    private static final long TIME_STATE_FOREGROUND_MS = 10 * DateUtils.MINUTE_IN_MILLIS;
    private static final long TIME_STATE_FOREGROUND_US = TIME_STATE_FOREGROUND_MS * 1000;


    private static final int UID = 123456;
    private static final int UID = 123456;
    private static final double BATTERY_SCREEN_USAGE = 300;
    private static final double BATTERY_SCREEN_USAGE = 300;
    private static final double BATTERY_SYSTEM_USAGE = 600;
    private static final double BATTERY_SYSTEM_USAGE = 600;
    private static final double BATTERY_WIFI_USAGE = 200;
    private static final double BATTERY_IDLE_USAGE = 600;
    private static final double BATTERY_BLUETOOTH_USAGE = 300;
    private static final double BATTERY_OVERACCOUNTED_USAGE = 500;
    private static final double BATTERY_OVERACCOUNTED_USAGE = 500;
    private static final double BATTERY_UNACCOUNTED_USAGE = 700;
    private static final double BATTERY_UNACCOUNTED_USAGE = 700;
    private static final double BATTERY_APP_USAGE = 100;
    private static final double BATTERY_APP_USAGE = 100;
@@ -68,6 +76,12 @@ public class BatteryStatsHelperTest extends TestCase {
    @Mock
    @Mock
    private BatteryStats.Uid mUid;
    private BatteryStats.Uid mUid;
    @Mock
    @Mock
    private BatterySipper mWifiBatterySipper;
    @Mock
    private BatterySipper mBluetoothBatterySipper;
    @Mock
    private BatterySipper mIdleBatterySipper;
    @Mock
    private BatterySipper mNormalBatterySipper;
    private BatterySipper mNormalBatterySipper;
    @Mock
    @Mock
    private BatterySipper mScreenBatterySipper;
    private BatterySipper mScreenBatterySipper;
@@ -109,6 +123,15 @@ public class BatteryStatsHelperTest extends TestCase {
        mUnaccountedBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED;
        mUnaccountedBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED;
        mUnaccountedBatterySipper.totalPowerMah = BATTERY_UNACCOUNTED_USAGE;
        mUnaccountedBatterySipper.totalPowerMah = BATTERY_UNACCOUNTED_USAGE;


        mWifiBatterySipper.drainType = BatterySipper.DrainType.WIFI;
        mWifiBatterySipper.totalPowerMah = BATTERY_WIFI_USAGE;

        mBluetoothBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH;
        mBluetoothBatterySipper.totalPowerMah = BATTERY_BLUETOOTH_USAGE;

        mIdleBatterySipper.drainType = BatterySipper.DrainType.IDLE;
        mIdleBatterySipper.totalPowerMah = BATTERY_IDLE_USAGE;

        mContext = InstrumentationRegistry.getContext();
        mContext = InstrumentationRegistry.getContext();
        mBatteryStatsHelper = spy(new BatteryStatsHelper(mContext));
        mBatteryStatsHelper = spy(new BatteryStatsHelper(mContext));
        mBatteryStatsHelper.setPackageManager(mPackageManager);
        mBatteryStatsHelper.setPackageManager(mPackageManager);
@@ -165,6 +188,9 @@ public class BatteryStatsHelperTest extends TestCase {
        sippers.add(mSystemBatterySipper);
        sippers.add(mSystemBatterySipper);
        sippers.add(mOvercountedBatterySipper);
        sippers.add(mOvercountedBatterySipper);
        sippers.add(mUnaccountedBatterySipper);
        sippers.add(mUnaccountedBatterySipper);
        sippers.add(mWifiBatterySipper);
        sippers.add(mBluetoothBatterySipper);
        sippers.add(mIdleBatterySipper);
        doReturn(true).when(mBatteryStatsHelper).isTypeSystem(mSystemBatterySipper);
        doReturn(true).when(mBatteryStatsHelper).isTypeSystem(mSystemBatterySipper);
        doNothing().when(mBatteryStatsHelper).smearScreenBatterySipper(any(), any());
        doNothing().when(mBatteryStatsHelper).smearScreenBatterySipper(any(), any());


@@ -219,6 +245,19 @@ public class BatteryStatsHelperTest extends TestCase {
        assertThat(mBatteryStatsHelper.isTypeService(mNormalBatterySipper)).isTrue();
        assertThat(mBatteryStatsHelper.isTypeService(mNormalBatterySipper)).isTrue();
    }
    }


    @Test
    public void testGetProcessForegroundTimeMs_largerActivityTime_returnMinTime() {
        doReturn(TIME_STATE_FOREGROUND_US + 500).when(mBatteryStatsHelper)
                .getForegroundActivityTotalTimeUs(eq(mUid), anyLong());
        doReturn(TIME_STATE_FOREGROUND_US).when(mUid).getProcessStateTime(eq(PROCESS_STATE_TOP),
                anyLong(), anyInt());

        final long time = mBatteryStatsHelper.getProcessForegroundTimeMs(mUid,
                BatteryStats.STATS_SINCE_CHARGED);

        assertThat(time).isEqualTo(TIME_STATE_FOREGROUND_MS);
    }

    private BatterySipper createTestSmearBatterySipper(long activityTime, double totalPowerMah,
    private BatterySipper createTestSmearBatterySipper(long activityTime, double totalPowerMah,
            int uidCode, boolean isUidNull) {
            int uidCode, boolean isUidNull) {
        final BatterySipper sipper = mock(BatterySipper.class);
        final BatterySipper sipper = mock(BatterySipper.class);
@@ -227,8 +266,8 @@ public class BatteryStatsHelperTest extends TestCase {
        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(mBatteryStatsHelper).getForegroundActivityTotalTimeMs(
            doReturn(activityTime).when(mBatteryStatsHelper).getProcessForegroundTimeMs(eq(uid),
                    eq(uid), anyLong());
                    anyInt());
            doReturn(uidCode).when(uid).getUid();
            doReturn(uidCode).when(uid).getUid();
            sipper.uidObj = uid;
            sipper.uidObj = uid;
        }
        }
@@ -236,5 +275,4 @@ public class BatteryStatsHelperTest extends TestCase {
        return sipper;
        return sipper;
    }
    }



}
}