Merge "Add log for BatteryUtils" into oc-dev
This commit is contained in:
@@ -104,10 +104,11 @@ public class AdvancedPowerUsageDetail extends PowerUsageBase implements
|
|||||||
final Bundle args = new Bundle();
|
final Bundle args = new Bundle();
|
||||||
final BatterySipper sipper = entry.sipper;
|
final BatterySipper sipper = entry.sipper;
|
||||||
final BatteryStats.Uid uid = sipper.uidObj;
|
final BatteryStats.Uid uid = sipper.uidObj;
|
||||||
|
final BatteryUtils batteryUtils = BatteryUtils.getInstance(caller);
|
||||||
|
|
||||||
final long backgroundTimeMs = BatteryUtils.getProcessTimeMs(
|
final long backgroundTimeMs = batteryUtils.getProcessTimeMs(
|
||||||
BatteryUtils.StatusType.BACKGROUND, uid, which);
|
BatteryUtils.StatusType.BACKGROUND, uid, which);
|
||||||
final long foregroundTimeMs = BatteryUtils.getProcessTimeMs(
|
final long foregroundTimeMs = batteryUtils.getProcessTimeMs(
|
||||||
BatteryUtils.StatusType.FOREGROUND, uid, which);
|
BatteryUtils.StatusType.FOREGROUND, uid, which);
|
||||||
|
|
||||||
if (ArrayUtils.isEmpty(sipper.mPackages)) {
|
if (ArrayUtils.isEmpty(sipper.mPackages)) {
|
||||||
|
@@ -16,9 +16,13 @@
|
|||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
import android.annotation.IntDef;
|
import android.annotation.IntDef;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.annotation.VisibleForTesting;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
@@ -38,7 +42,23 @@ public class BatteryUtils {
|
|||||||
int ALL = 2;
|
int ALL = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long getProcessTimeMs(@StatusType int type, @Nullable BatteryStats.Uid uid,
|
private static final String TAG = "BatteryUtils";
|
||||||
|
private static BatteryUtils sInstance;
|
||||||
|
|
||||||
|
private PackageManager mPackageManager;
|
||||||
|
|
||||||
|
public static BatteryUtils getInstance(Context context) {
|
||||||
|
if (sInstance == null || sInstance.isDataCorrupted()) {
|
||||||
|
sInstance = new BatteryUtils(context);
|
||||||
|
}
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BatteryUtils(Context context) {
|
||||||
|
mPackageManager = context.getPackageManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getProcessTimeMs(@StatusType int type, @Nullable BatteryStats.Uid uid,
|
||||||
int which) {
|
int which) {
|
||||||
if (uid == null) {
|
if (uid == null) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -56,34 +76,46 @@ public class BatteryUtils {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
|
private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) {
|
||||||
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
final long timeUs = uid.getProcessStateTime(
|
final long timeUs = uid.getProcessStateTime(
|
||||||
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
|
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which);
|
||||||
|
|
||||||
|
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
|
||||||
|
Log.v(TAG, "background time(us): " + timeUs);
|
||||||
return convertUsToMs(timeUs);
|
return convertUsToMs(timeUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
|
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) {
|
||||||
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime());
|
||||||
final int foregroundTypes[] = {BatteryStats.Uid.PROCESS_STATE_TOP,
|
final int foregroundTypes[] = {BatteryStats.Uid.PROCESS_STATE_TOP,
|
||||||
BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
|
BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE,
|
||||||
BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING,
|
BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING,
|
||||||
BatteryStats.Uid.PROCESS_STATE_FOREGROUND};
|
BatteryStats.Uid.PROCESS_STATE_FOREGROUND};
|
||||||
|
Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid()));
|
||||||
|
|
||||||
long timeUs = 0;
|
long timeUs = 0;
|
||||||
for (int type : foregroundTypes) {
|
for (int type : foregroundTypes) {
|
||||||
timeUs += uid.getProcessStateTime(type, rawRealTimeUs, which);
|
final long localTime = uid.getProcessStateTime(type, rawRealTimeUs, which);
|
||||||
|
Log.v(TAG, "type: " + type + " time(us): " + localTime);
|
||||||
|
timeUs += localTime;
|
||||||
}
|
}
|
||||||
|
Log.v(TAG, "foreground time(us): " + timeUs);
|
||||||
|
|
||||||
return convertUsToMs(timeUs);
|
return convertUsToMs(timeUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long convertUsToMs(long timeUs) {
|
private long convertUsToMs(long timeUs) {
|
||||||
return timeUs / 1000;
|
return timeUs / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long convertMsToUs(long timeMs) {
|
private long convertMsToUs(long timeMs) {
|
||||||
return timeMs * 1000;
|
return timeMs * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isDataCorrupted() {
|
||||||
|
return mPackageManager == null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -74,6 +74,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
|
|||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
private Map<Integer, PowerUsageData> mBatteryDataMap;
|
private Map<Integer, PowerUsageData> mBatteryDataMap;
|
||||||
|
private BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
Handler mHandler = new Handler() {
|
Handler mHandler = new Handler() {
|
||||||
|
|
||||||
@@ -117,6 +118,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
|
|||||||
.getPowerUsageFeatureProvider(context);
|
.getPowerUsageFeatureProvider(context);
|
||||||
mPackageManager = context.getPackageManager();
|
mPackageManager = context.getPackageManager();
|
||||||
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -239,8 +241,8 @@ public class PowerUsageAdvanced extends PowerUsageBase {
|
|||||||
final PowerUsageData usageData = batteryDataMap.get(extractUsageType(sipper));
|
final PowerUsageData usageData = batteryDataMap.get(extractUsageType(sipper));
|
||||||
usageData.totalPowerMah += sipper.totalPowerMah;
|
usageData.totalPowerMah += sipper.totalPowerMah;
|
||||||
if (sipper.drainType == DrainType.APP && sipper.usageTimeMs != 0) {
|
if (sipper.drainType == DrainType.APP && sipper.usageTimeMs != 0) {
|
||||||
sipper.usageTimeMs = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL,
|
sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs(
|
||||||
sipper.uidObj, STATUS_TYPE);
|
BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, STATUS_TYPE);
|
||||||
}
|
}
|
||||||
usageData.totalUsageTimeMs += sipper.usageTimeMs;
|
usageData.totalUsageTimeMs += sipper.usageTimeMs;
|
||||||
usageData.usageList.add(sipper);
|
usageData.usageList.add(sipper);
|
||||||
|
@@ -110,6 +110,8 @@ public class PowerUsageSummary extends PowerUsageBase {
|
|||||||
PowerGaugePreference mLastFullChargePref;
|
PowerGaugePreference mLastFullChargePref;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
PowerUsageFeatureProvider mPowerFeatureProvider;
|
PowerUsageFeatureProvider mPowerFeatureProvider;
|
||||||
|
@VisibleForTesting
|
||||||
|
BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
private LayoutPreference mBatteryLayoutPref;
|
private LayoutPreference mBatteryLayoutPref;
|
||||||
private PreferenceGroup mAppListGroup;
|
private PreferenceGroup mAppListGroup;
|
||||||
@@ -127,6 +129,8 @@ public class PowerUsageSummary extends PowerUsageBase {
|
|||||||
KEY_TIME_SINCE_LAST_FULL_CHARGE);
|
KEY_TIME_SINCE_LAST_FULL_CHARGE);
|
||||||
mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.battery_footer_summary);
|
mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.battery_footer_summary);
|
||||||
|
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(getContext());
|
||||||
|
|
||||||
initFeatureProvider();
|
initFeatureProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,7 +498,7 @@ public class PowerUsageSummary extends PowerUsageBase {
|
|||||||
pref.setOrder(i + 1);
|
pref.setOrder(i + 1);
|
||||||
pref.setPercent(percentOfTotal);
|
pref.setPercent(percentOfTotal);
|
||||||
if (sipper.usageTimeMs == 0 && sipper.drainType == DrainType.APP) {
|
if (sipper.usageTimeMs == 0 && sipper.drainType == DrainType.APP) {
|
||||||
sipper.usageTimeMs = BatteryUtils.getProcessTimeMs(
|
sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs(
|
||||||
BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, mStatsType);
|
BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, mStatsType);
|
||||||
}
|
}
|
||||||
setUsageSummary(pref, usedTime, sipper.usageTimeMs);
|
setUsageSummary(pref, usedTime, sipper.usageTimeMs);
|
||||||
|
@@ -74,7 +74,7 @@ public final class InstalledAppDetailsTest {
|
|||||||
ApplicationFeatureProvider mApplicationFeatureProvider;
|
ApplicationFeatureProvider mApplicationFeatureProvider;
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
@Mock
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
private SettingsActivity mActivity;
|
private SettingsActivity mActivity;
|
||||||
@Mock
|
@Mock
|
||||||
private DevicePolicyManager mDevicePolicyManager;
|
private DevicePolicyManager mDevicePolicyManager;
|
||||||
|
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -96,7 +97,8 @@ public class AdvancedPowerUsageDetailTest {
|
|||||||
private BatteryStatsHelper mBatteryStatsHelper;
|
private BatteryStatsHelper mBatteryStatsHelper;
|
||||||
@Mock
|
@Mock
|
||||||
private BatteryStats.Uid mUid;
|
private BatteryStats.Uid mUid;
|
||||||
private Bundle mTestBundle;
|
@Mock
|
||||||
|
private PackageManager mPackageManager;
|
||||||
private AdvancedPowerUsageDetail mFragment;
|
private AdvancedPowerUsageDetail mFragment;
|
||||||
private FakeFeatureFactory mFeatureFactory;
|
private FakeFeatureFactory mFeatureFactory;
|
||||||
private SettingsActivity mTestActivity;
|
private SettingsActivity mTestActivity;
|
||||||
@@ -141,6 +143,7 @@ public class AdvancedPowerUsageDetailTest {
|
|||||||
mAppEntry.info = mock(ApplicationInfo.class);
|
mAppEntry.info = mock(ApplicationInfo.class);
|
||||||
|
|
||||||
mTestActivity = spy(new SettingsActivity());
|
mTestActivity = spy(new SettingsActivity());
|
||||||
|
doReturn(mPackageManager).when(mTestActivity).getPackageManager();
|
||||||
|
|
||||||
final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
|
final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@ import org.junit.Test;
|
|||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
import static android.os.BatteryStats.Uid.PROCESS_STATE_BACKGROUND;
|
import static android.os.BatteryStats.Uid.PROCESS_STATE_BACKGROUND;
|
||||||
@@ -56,7 +57,8 @@ public class BatteryUtilsTest {
|
|||||||
private static final long TIME_EXPECTED_ALL = 15000;
|
private static final long TIME_EXPECTED_ALL = 15000;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
BatteryStats.Uid mUid;
|
private BatteryStats.Uid mUid;
|
||||||
|
private BatteryUtils mBatteryUtils;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -72,11 +74,13 @@ public class BatteryUtilsTest {
|
|||||||
anyLong(), anyInt());
|
anyLong(), anyInt());
|
||||||
doReturn(TIME_STATE_BACKGROUND).when(mUid).getProcessStateTime(eq(PROCESS_STATE_BACKGROUND),
|
doReturn(TIME_STATE_BACKGROUND).when(mUid).getProcessStateTime(eq(PROCESS_STATE_BACKGROUND),
|
||||||
anyLong(), anyInt());
|
anyLong(), anyInt());
|
||||||
|
|
||||||
|
mBatteryUtils = BatteryUtils.getInstance(RuntimeEnvironment.application);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_typeForeground_timeCorrect() {
|
public void testGetProcessTimeMs_typeForeground_timeCorrect() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.FOREGROUND, mUid,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(TIME_EXPECTED_FOREGROUND);
|
assertThat(time).isEqualTo(TIME_EXPECTED_FOREGROUND);
|
||||||
@@ -84,7 +88,7 @@ public class BatteryUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_typeBackground_timeCorrect() {
|
public void testGetProcessTimeMs_typeBackground_timeCorrect() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.BACKGROUND, mUid,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.BACKGROUND, mUid,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(TIME_EXPECTED_BACKGROUND);
|
assertThat(time).isEqualTo(TIME_EXPECTED_BACKGROUND);
|
||||||
@@ -92,7 +96,7 @@ public class BatteryUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_typeAll_timeCorrect() {
|
public void testGetProcessTimeMs_typeAll_timeCorrect() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, mUid,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(TIME_EXPECTED_ALL);
|
assertThat(time).isEqualTo(TIME_EXPECTED_ALL);
|
||||||
@@ -100,7 +104,7 @@ public class BatteryUtilsTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetProcessTimeMs_uidNull_returnZero() {
|
public void testGetProcessTimeMs_uidNull_returnZero() {
|
||||||
final long time = BatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, null,
|
final long time = mBatteryUtils.getProcessTimeMs(BatteryUtils.StatusType.ALL, null,
|
||||||
BatteryStats.STATS_SINCE_CHARGED);
|
BatteryStats.STATS_SINCE_CHARGED);
|
||||||
|
|
||||||
assertThat(time).isEqualTo(0);
|
assertThat(time).isEqualTo(0);
|
||||||
|
Reference in New Issue
Block a user