Combine system apps to one item in the battery usage app list.

Bug: 262952385
Test: 262952385
Test: maunal
Change-Id: I078677b13a22f5e2f8f194bb5d5259f8c54c6b1e
This commit is contained in:
Zaiyue Xue
2022-12-17 15:53:40 +08:00
parent 949dd58112
commit e756675e69
12 changed files with 276 additions and 90 deletions

View File

@@ -603,9 +603,6 @@
<!-- Whether to show communal settings at the top level. --> <!-- Whether to show communal settings at the top level. -->
<bool name="config_show_communal_settings">false</bool> <bool name="config_show_communal_settings">false</bool>
<!-- Whether to put the apps with system UID into system component bucket or not -->
<bool name="config_battery_combine_system_components">false</bool>
<!-- The extra value for battery tip --> <!-- The extra value for battery tip -->
<integer name="config_battery_extra_tip_value">12</integer> <integer name="config_battery_extra_tip_value">12</integer>

View File

@@ -5065,6 +5065,8 @@
<string name="battery_not_usage_24hr">No usage for past 24 hr</string> <string name="battery_not_usage_24hr">No usage for past 24 hr</string>
<!-- Description for no usage time but have battery usage [CHAR LIMIT=120] --> <!-- Description for no usage time but have battery usage [CHAR LIMIT=120] -->
<string name="battery_usage_without_time"></string> <string name="battery_usage_without_time"></string>
<!-- Description for system apps aggregated battery usage data [CHAR LIMIT=120] -->
<string name="battery_usage_system_apps">System apps</string>
<!-- Description for battery time left, i.e. 50min Estimated time left. [CHAR LIMIT=80]--> <!-- Description for battery time left, i.e. 50min Estimated time left. [CHAR LIMIT=80]-->
<string name="estimated_time_left">Estimated time left</string> <string name="estimated_time_left">Estimated time left</string>

View File

@@ -22,6 +22,7 @@ import android.util.SparseIntArray;
import com.android.settingslib.fuelgauge.Estimate; import com.android.settingslib.fuelgauge.Estimate;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@@ -34,6 +35,11 @@ public interface PowerUsageFeatureProvider {
*/ */
boolean isBatteryUsageEnabled(Context context); boolean isBatteryUsageEnabled(Context context);
/**
* Returns an allowlist of app names combined into the system-apps item
*/
List<String> getSystemAppsAllowlist(Context context);
/** /**
* Check whether location setting is enabled * Check whether location setting is enabled
*/ */

View File

@@ -26,6 +26,7 @@ import android.util.SparseIntArray;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import com.android.settingslib.fuelgauge.Estimate; import com.android.settingslib.fuelgauge.Estimate;
import java.util.List;
import java.util.Set; import java.util.Set;
/** Implementation of {@code PowerUsageFeatureProvider} */ /** Implementation of {@code PowerUsageFeatureProvider} */
@@ -70,6 +71,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider
return true; return true;
} }
@Override
public List<String> getSystemAppsAllowlist(Context context) {
return null;
}
@Override @Override
public boolean isLocationSettingEnabled(String[] packages) { public boolean isLocationSettingEnabled(String[] packages) {
return false; return false;

View File

@@ -15,12 +15,12 @@
*/ */
package com.android.settings.fuelgauge.batteryusage; package com.android.settings.fuelgauge.batteryusage;
import android.content.ContentValues;
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.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Process;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.util.Log; import android.util.Log;
@@ -62,10 +62,10 @@ public class BatteryDiffEntry {
// A BatteryHistEntry corresponding to this diff usage data. // A BatteryHistEntry corresponding to this diff usage data.
public final BatteryHistEntry mBatteryHistEntry; public final BatteryHistEntry mBatteryHistEntry;
protected Context mContext;
private double mTotalConsumePower; private double mTotalConsumePower;
private double mPercentOfTotal; private double mPercentOfTotal;
private Context mContext;
private UserManager mUserManager; private UserManager mUserManager;
private String mDefaultPackageName = null; private String mDefaultPackageName = null;
@@ -111,6 +111,11 @@ public class BatteryDiffEntry {
? 0 : (mConsumePower / mTotalConsumePower) * 100.0; ? 0 : (mConsumePower / mTotalConsumePower) * 100.0;
} }
/** Gets the total consumed power in a specific time slot. */
public double getTotalConsumePower() {
return mTotalConsumePower;
}
/** Gets the percentage of total consumed power. */ /** Gets the percentage of total consumed power. */
public double getPercentOfTotal() { public double getPercentOfTotal() {
return mPercentOfTotal; return mPercentOfTotal;
@@ -176,23 +181,17 @@ public class BatteryDiffEntry {
/** Whether the current BatteryDiffEntry is system component or not. */ /** Whether the current BatteryDiffEntry is system component or not. */
public boolean isSystemEntry() { public boolean isSystemEntry() {
if (mBatteryHistEntry.mIsHidden) {
return false;
}
switch (mBatteryHistEntry.mConsumerType) { switch (mBatteryHistEntry.mConsumerType) {
case ConvertUtils.CONSUMER_TYPE_USER_BATTERY: case ConvertUtils.CONSUMER_TYPE_USER_BATTERY:
case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY: case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY:
return true; return true;
case ConvertUtils.CONSUMER_TYPE_UID_BATTERY: case ConvertUtils.CONSUMER_TYPE_UID_BATTERY:
final int uid = (int) mBatteryHistEntry.mUid; default:
if (mBatteryHistEntry.mIsHidden return false;
|| uid == BatteryUtils.UID_REMOVED_APPS
|| uid == BatteryUtils.UID_TETHERING) {
return true;
}
final boolean combineSystemComponents =
mContext.getResources().getBoolean(
R.bool.config_battery_combine_system_components);
return combineSystemComponents && isSystemUid(uid);
} }
return false;
} }
void loadLabelAndIcon() { void loadLabelAndIcon() {
@@ -396,8 +395,44 @@ public class BatteryDiffEntry {
mUserManager.getBadgedIconForUser(icon, new UserHandle(userId)); mUserManager.getBadgedIconForUser(icon, new UserHandle(userId));
} }
private static boolean isSystemUid(int uid) { /** Specific battery diff entry for system apps. */
final int appUid = UserHandle.getAppId(uid); static class SystemAppsBatteryDiffEntry extends BatteryDiffEntry {
return appUid >= Process.SYSTEM_UID && appUid < Process.FIRST_APPLICATION_UID; SystemAppsBatteryDiffEntry(Context context) {
super(context,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0,
/*screenOnTimeInMs=*/ 0,
/*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0,
new BatteryHistEntry(new ContentValues()));
}
@Override
public String getKey() {
return "A|SystemApps";
}
@Override
public String getAppLabel() {
return mContext.getString(R.string.battery_usage_system_apps);
}
@Override
public Drawable getAppIcon() {
return mContext.getDrawable(R.drawable.ic_power_system);
}
@Override
public boolean validForRestriction() {
return false;
}
@Override
public boolean isSystemEntry() {
return false;
}
} }
} }

View File

@@ -200,11 +200,11 @@ public class BatteryEntry {
/** Battery entry for a power component of AggregateBatteryConsumer */ /** Battery entry for a power component of AggregateBatteryConsumer */
public BatteryEntry(Context context, int powerComponentId, double devicePowerMah, public BatteryEntry(Context context, int powerComponentId, double devicePowerMah,
long usageDurationMs) { long usageDurationMs, boolean isHidden) {
mContext = context; mContext = context;
mBatteryConsumer = null; mBatteryConsumer = null;
mUid = Process.INVALID_UID; mUid = Process.INVALID_UID;
mIsHidden = false; mIsHidden = isHidden;
mPowerComponentId = powerComponentId; mPowerComponentId = powerComponentId;
mConsumedPower = devicePowerMah; mConsumedPower = devicePowerMah;
mUsageDurationMs = usageDurationMs; mUsageDurationMs = usageDurationMs;

View File

@@ -242,7 +242,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
Log.w(TAG, "cannot find app resource for:" + entry.getPackageName()); Log.w(TAG, "cannot find app resource for:" + entry.getPackageName());
continue; continue;
} }
final String prefKey = entry.mBatteryHistEntry.getKey(); final String prefKey = entry.getKey();
PowerGaugePreference pref = mAppListPreferenceGroup.findPreference(prefKey); PowerGaugePreference pref = mAppListPreferenceGroup.findPreference(prefKey);
if (pref != null) { if (pref != null) {
isAdded = true; isAdded = true;

View File

@@ -19,6 +19,7 @@ package com.android.settings.fuelgauge.batteryusage;
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.getEffectivePackageName; import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.getEffectivePackageName;
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.utcToLocalTime; import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.utcToLocalTime;
import android.app.Application;
import android.app.usage.IUsageStatsManager; import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageEvents; import android.app.usage.UsageEvents;
import android.app.usage.UsageEvents.Event; import android.app.usage.UsageEvents.Event;
@@ -52,6 +53,7 @@ import com.android.internal.os.PowerProfile;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.fuelgauge.BatteryStatus; import com.android.settingslib.fuelgauge.BatteryStatus;
import java.time.Duration; import java.time.Duration;
@@ -75,6 +77,8 @@ import java.util.stream.Stream;
public final class DataProcessor { public final class DataProcessor {
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
private static final String TAG = "DataProcessor"; private static final String TAG = "DataProcessor";
private static final int POWER_COMPONENT_SYSTEM_SERVICES = 7;
private static final int POWER_COMPONENT_WAKELOCK = 12;
private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10; private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10;
private static final int MIN_DAILY_DATA_SIZE = 2; private static final int MIN_DAILY_DATA_SIZE = 2;
private static final int MIN_TIMESTAMP_DATA_SIZE = 2; private static final int MIN_TIMESTAMP_DATA_SIZE = 2;
@@ -1714,6 +1718,7 @@ public final class DataProcessor {
hideBackgroundUsageTimeSet); hideBackgroundUsageTimeSet);
batteryDiffData.setTotalConsumePower(); batteryDiffData.setTotalConsumePower();
batteryDiffData.sortEntries(); batteryDiffData.sortEntries();
combineIntoSystemApps(context, batteryDiffData);
}); });
}); });
} }
@@ -1739,6 +1744,64 @@ public final class DataProcessor {
} }
} }
private static void combineIntoSystemApps(
final Context context, final BatteryDiffData batteryDiffData) {
final List<String> systemAppsAllowlist =
FeatureFactory.getFactory(context)
.getPowerUsageFeatureProvider(context)
.getSystemAppsAllowlist(context);
final Application application = (Application) context.getApplicationContext();
final ApplicationsState applicationsState =
application == null ? null : ApplicationsState.getInstance(application);
BatteryDiffEntry.SystemAppsBatteryDiffEntry systemAppsDiffEntry = null;
final Iterator<BatteryDiffEntry> appListIterator =
batteryDiffData.getAppDiffEntryList().iterator();
while (appListIterator.hasNext()) {
final BatteryDiffEntry batteryDiffEntry = appListIterator.next();
if (needsCombineInSystemApp(batteryDiffEntry, systemAppsAllowlist, applicationsState)) {
if (systemAppsDiffEntry == null) {
systemAppsDiffEntry = new BatteryDiffEntry.SystemAppsBatteryDiffEntry(context);
}
systemAppsDiffEntry.mConsumePower += batteryDiffEntry.mConsumePower;
systemAppsDiffEntry.setTotalConsumePower(
batteryDiffEntry.getTotalConsumePower());
appListIterator.remove();
}
}
if (systemAppsDiffEntry != null) {
batteryDiffData.getAppDiffEntryList().add(systemAppsDiffEntry);
}
}
@VisibleForTesting
static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry,
final List<String> systemAppsAllowlist, final ApplicationsState applicationsState) {
if (batteryDiffEntry.mBatteryHistEntry.mIsHidden) {
return true;
}
final String packageName = batteryDiffEntry.getPackageName();
if (packageName == null || packageName.isEmpty()) {
return false;
}
if (systemAppsAllowlist != null && systemAppsAllowlist.contains(packageName)) {
return true;
}
if (applicationsState == null) {
return false;
}
final ApplicationsState.AppEntry appEntry =
applicationsState.getEntry(packageName, /* userId= */ 0);
if (appEntry == null || appEntry.info == null) {
return false;
}
return !ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER_AND_INSTANT.filterApp(
appEntry);
}
private static boolean shouldShowBatteryAttributionList(final Context context) { private static boolean shouldShowBatteryAttributionList(final Context context) {
final PowerProfile powerProfile = new PowerProfile(context); final PowerProfile powerProfile = new PowerProfile(context);
// Cheap hack to try to figure out if the power_profile.xml was populated. // Cheap hack to try to figure out if the power_profile.xml was populated.
@@ -1804,7 +1867,9 @@ public final class DataProcessor {
componentId++) { componentId++) {
results.add(new BatteryEntry(context, componentId, results.add(new BatteryEntry(context, componentId,
deviceConsumer.getConsumedPower(componentId), deviceConsumer.getConsumedPower(componentId),
deviceConsumer.getUsageDurationMillis(componentId))); deviceConsumer.getUsageDurationMillis(componentId),
componentId == POWER_COMPONENT_SYSTEM_SERVICES
|| componentId == POWER_COMPONENT_WAKELOCK));
} }
for (int componentId = BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID; for (int componentId = BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID;

View File

@@ -95,6 +95,7 @@ public final class BatteryChartPreferenceControllerTest {
.when(mContext) .when(mContext)
.getSystemService(UserManager.class); .getSystemService(UserManager.class);
doReturn(true).when(mUserManager).isUserUnlocked(anyInt()); doReturn(true).when(mUserManager).isUserUnlocked(anyInt());
doReturn(new int[]{0}).when(mUserManager).getProfileIdsWithDisabled(anyInt());
final Resources resources = spy(mContext.getResources()); final Resources resources = spy(mContext.getResources());
resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US"))); resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
doReturn(resources).when(mContext).getResources(); doReturn(resources).when(mContext).getResources();

View File

@@ -370,15 +370,6 @@ public final class BatteryDiffEntryTest {
assertThat(entry.isSystemEntry()).isFalse(); assertThat(entry.isSystemEntry()).isFalse();
} }
@Test
public void testIsSystemEntry_uidBatteryWithHiddenState_returnTrue() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*uid=*/ 123, /*isHidden=*/ true);
assertThat(entry.isSystemEntry()).isTrue();
}
@Test @Test
public void testIsSystemEntry_uidBatteryWithSystemProcess_returnFalse() { public void testIsSystemEntry_uidBatteryWithSystemProcess_returnFalse() {
final BatteryDiffEntry entry = final BatteryDiffEntry entry =
@@ -388,24 +379,6 @@ public final class BatteryDiffEntryTest {
assertThat(entry.isSystemEntry()).isFalse(); assertThat(entry.isSystemEntry()).isFalse();
} }
@Test
public void testIsSystemEntry_uidBatteryWithTetheringProcess_returnTrue() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*uid=*/ BatteryUtils.UID_TETHERING, /*isHidden=*/ false);
assertThat(entry.isSystemEntry()).isTrue();
}
@Test
public void testIsSystemEntry_uidBatteryWithRemovedAppsProcess_returnTrue() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*uid=*/ BatteryUtils.UID_REMOVED_APPS, /*isHidden=*/ false);
assertThat(entry.isSystemEntry()).isTrue();
}
@Test @Test
public void testUpdateRestrictionFlagState_updateFlagAsExpected() throws Exception { public void testUpdateRestrictionFlagState_updateFlagAsExpected() throws Exception {
final String expectedAppLabel = "fake app label"; final String expectedAppLabel = "fake app label";

View File

@@ -108,7 +108,8 @@ public class BatteryEntryTest {
mMockContext, mMockContext,
powerComponentId, powerComponentId,
/* devicePowerMah= */ 200, /* devicePowerMah= */ 200,
/* usageDurationMs= */ 1000); /* usageDurationMs= */ 1000,
/* isHidden= */ false);
} }
private BatteryEntry createCustomAggregateBatteryEntry(int powerComponentId) { private BatteryEntry createCustomAggregateBatteryEntry(int powerComponentId) {
@@ -169,7 +170,8 @@ public class BatteryEntryTest {
final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
/* devicePowerMah= */ 200, /* devicePowerMah= */ 200,
/* usageDurationMs= */ 1000); /* usageDurationMs= */ 1000,
/* isHidden= */ false);
assertThat(entry.mIconId).isEqualTo(R.drawable.ic_settings_aod); assertThat(entry.mIconId).isEqualTo(R.drawable.ic_settings_aod);
assertThat(entry.mName).isEqualTo("Ambient display"); assertThat(entry.mName).isEqualTo("Ambient display");
@@ -202,7 +204,8 @@ public class BatteryEntryTest {
final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
BatteryConsumer.POWER_COMPONENT_BLUETOOTH, BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
/* devicePowerMah= */ 10, /* devicePowerMah= */ 10,
/* usageDurationMs= */ 100); /* usageDurationMs= */ 100,
/* isHidden= */ false);
assertThat(entry.getTimeInForegroundMs()).isEqualTo(100L); assertThat(entry.getTimeInForegroundMs()).isEqualTo(100L);
} }
@@ -223,7 +226,8 @@ public class BatteryEntryTest {
final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application,
BatteryConsumer.POWER_COMPONENT_BLUETOOTH, BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
/* devicePowerMah= */ 100, /* devicePowerMah= */ 100,
/* usageDurationMs= */ 1000); /* usageDurationMs= */ 1000,
/* isHidden= */ false);
assertThat(entry.getTimeInBackgroundMs()).isEqualTo(0); assertThat(entry.getTimeInBackgroundMs()).isEqualTo(0);
} }

View File

@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@@ -32,6 +33,7 @@ import android.app.usage.UsageEvents.Event;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.os.BatteryConsumer; import android.os.BatteryConsumer;
import android.os.BatteryManager; import android.os.BatteryManager;
@@ -43,6 +45,7 @@ import android.text.format.DateUtils;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -75,13 +78,15 @@ public final class DataProcessorTest {
@Mock private BatteryUsageStats mBatteryUsageStats; @Mock private BatteryUsageStats mBatteryUsageStats;
@Mock private UserManager mUserManager; @Mock private UserManager mUserManager;
@Mock private IUsageStatsManager mUsageStatsManager; @Mock private IUsageStatsManager mUsageStatsManager;
@Mock private ApplicationsState mApplicationsState;
@Mock private ApplicationsState.AppEntry mAppEntry;
@Mock private ApplicationInfo mApplicationInfo;
@Mock private BatteryEntry mMockBatteryEntry1; @Mock private BatteryEntry mMockBatteryEntry1;
@Mock private BatteryEntry mMockBatteryEntry2; @Mock private BatteryEntry mMockBatteryEntry2;
@Mock private BatteryEntry mMockBatteryEntry3; @Mock private BatteryEntry mMockBatteryEntry3;
@Mock private BatteryEntry mMockBatteryEntry4; @Mock private BatteryEntry mMockBatteryEntry4;
@Mock private UsageEvents mUsageEvents1; @Mock private UsageEvents mUsageEvents1;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
@@ -95,7 +100,9 @@ public final class DataProcessorTest {
doReturn(mIntent).when(mContext).registerReceiver(any(), any()); doReturn(mIntent).when(mContext).registerReceiver(any(), any());
doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt()); doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());
doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt()); doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt());
doReturn(mContext).when(mContext).getApplicationContext();
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
doReturn(new int[]{0}).when(mUserManager).getProfileIdsWithDisabled(anyInt());
} }
@Test @Test
@@ -768,7 +775,8 @@ public final class DataProcessorTest {
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L); /*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L,
/*isHidden=*/ false);
// Adds the index = 0 data. // Adds the index = 0 data.
Map<String, BatteryHistEntry> entryMap = new HashMap<>(); Map<String, BatteryHistEntry> entryMap = new HashMap<>();
BatteryHistEntry entry = createBatteryHistEntry( BatteryHistEntry entry = createBatteryHistEntry(
@@ -777,7 +785,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry); entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap); batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
@@ -793,7 +801,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5, /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 15L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 15L,
/*backgroundUsageTimeInMs=*/ 25L); /*backgroundUsageTimeInMs=*/ 25L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry); entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap); batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
@@ -805,7 +813,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8, /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 25L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 25L,
/*backgroundUsageTimeInMs=*/ 35L); /*backgroundUsageTimeInMs=*/ 35L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package3", "label3", /*consumePower=*/ 10.0, "package3", "label3", /*consumePower=*/ 10.0,
@@ -813,7 +821,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2, /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
/*uid=*/ 3L, currentUserId, /*uid=*/ 3L, currentUserId,
ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 40L, ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 40L,
/*backgroundUsageTimeInMs=*/ 50L); /*backgroundUsageTimeInMs=*/ 50L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package4", "label3", /*consumePower=*/ 15.0, "package4", "label3", /*consumePower=*/ 15.0,
@@ -821,7 +829,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 3, /*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 3,
/*uid=*/ 4L, currentUserId, /*uid=*/ 4L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L,
/*backgroundUsageTimeInMs=*/ 5L); /*backgroundUsageTimeInMs=*/ 5L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry); entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[3], entryMap); batteryHistoryMap.put(batteryHistoryKeys[3], entryMap);
@@ -833,7 +841,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 9, /*cachedUsageConsumePower=*/ 8, /*backgroundUsageConsumePower=*/ 9, /*cachedUsageConsumePower=*/ 8,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
/*backgroundUsageTimeInMs=*/ 40L); /*backgroundUsageTimeInMs=*/ 40L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package3", "label3", /*consumePower=*/ 20.0, "package3", "label3", /*consumePower=*/ 20.0,
@@ -841,7 +849,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5, /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
/*uid=*/ 3L, currentUserId, /*uid=*/ 3L, currentUserId,
ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 50L, ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 50L,
/*backgroundUsageTimeInMs=*/ 60L); /*backgroundUsageTimeInMs=*/ 60L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package4", "label4", /*consumePower=*/ 40.0, "package4", "label4", /*consumePower=*/ 40.0,
@@ -849,7 +857,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8, /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
/*uid=*/ 4L, currentUserId, /*uid=*/ 4L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L,
/*backgroundUsageTimeInMs=*/ 5L); /*backgroundUsageTimeInMs=*/ 5L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entryMap.put(fakeEntry.getKey(), fakeEntry); entryMap.put(fakeEntry.getKey(), fakeEntry);
batteryHistoryMap.put(batteryHistoryKeys[4], entryMap); batteryHistoryMap.put(batteryHistoryKeys[4], entryMap);
@@ -966,7 +974,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package1", "label1", /*consumePower=*/ 10.0, "package1", "label1", /*consumePower=*/ 10.0,
@@ -974,7 +982,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 1, /*cachedUsageConsumePower=*/ 1, /*backgroundUsageConsumePower=*/ 1, /*cachedUsageConsumePower=*/ 1,
/*uid=*/ 2L, currentUserId + 1, /*uid=*/ 2L, currentUserId + 1,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 5.0, "package2", "label2", /*consumePower=*/ 5.0,
@@ -982,7 +990,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 3L, currentUserId + 2, /*uid=*/ 3L, currentUserId + 2,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
/*backgroundUsageTimeInMs=*/ 30L); /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap); batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data. // Adds the index = 1 data.
@@ -993,7 +1001,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2, /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
/*backgroundUsageTimeInMs=*/ 30L); /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package1", "label1", /*consumePower=*/ 30.0, "package1", "label1", /*consumePower=*/ 30.0,
@@ -1001,7 +1009,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2, /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
/*uid=*/ 2L, currentUserId + 1, /*uid=*/ 2L, currentUserId + 1,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 15.0, "package2", "label2", /*consumePower=*/ 15.0,
@@ -1009,7 +1017,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 3L, currentUserId + 2, /*uid=*/ 3L, currentUserId + 2,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
/*backgroundUsageTimeInMs=*/ 30L); /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap); batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data. // Adds the index = 2 data.
@@ -1020,7 +1028,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5, /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
/*backgroundUsageTimeInMs=*/ 30L); /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package1", "label1", /*consumePower=*/ 50.0, "package1", "label1", /*consumePower=*/ 50.0,
@@ -1028,7 +1036,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 10, /*cachedUsageConsumePower=*/ 10, /*backgroundUsageConsumePower=*/ 10, /*cachedUsageConsumePower=*/ 10,
/*uid=*/ 2L, currentUserId + 1, /*uid=*/ 2L, currentUserId + 1,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 25.0, "package2", "label2", /*consumePower=*/ 25.0,
@@ -1036,7 +1044,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 3L, currentUserId + 2, /*uid=*/ 3L, currentUserId + 2,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
/*backgroundUsageTimeInMs=*/ 30L); /*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap); batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay = final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
@@ -1084,7 +1092,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap); batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data. // Adds the index = 1 data.
@@ -1095,7 +1103,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap); batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data. // Adds the index = 2 data.
@@ -1106,7 +1114,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 100, /*cachedUsageConsumePower=*/ 100, /*backgroundUsageConsumePower=*/ 100, /*cachedUsageConsumePower=*/ 100,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 3600000L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 3600000L,
/*backgroundUsageTimeInMs=*/ 7200000L); /*backgroundUsageTimeInMs=*/ 7200000L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap); batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay = final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
@@ -1174,7 +1182,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 0, "package2", "label2", /*consumePower=*/ 0,
@@ -1182,7 +1190,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap); batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data. // Adds the index = 1 data.
@@ -1193,7 +1201,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 0, "package2", "label2", /*consumePower=*/ 0,
@@ -1201,7 +1209,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap); batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data. // Adds the index = 2 data.
@@ -1212,7 +1220,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 10.0, "package2", "label2", /*consumePower=*/ 10.0,
@@ -1220,7 +1228,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5, /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap); batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay = final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
@@ -1267,7 +1275,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 0, "package2", "label2", /*consumePower=*/ 0,
@@ -1275,7 +1283,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[0], entryMap); batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
// Adds the index = 1 data. // Adds the index = 1 data.
@@ -1286,7 +1294,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 0, "package2", "label2", /*consumePower=*/ 0,
@@ -1294,7 +1302,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
/*backgroundUsageTimeInMs=*/ 0L); /*backgroundUsageTimeInMs=*/ 0L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[1], entryMap); batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
// Adds the index = 2 data. // Adds the index = 2 data.
@@ -1305,7 +1313,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 1L, currentUserId, /*uid=*/ 1L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
entry = createBatteryHistEntry( entry = createBatteryHistEntry(
"package2", "label2", /*consumePower=*/ 10.0, "package2", "label2", /*consumePower=*/ 10.0,
@@ -1313,7 +1321,7 @@ public final class DataProcessorTest {
/*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5, /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
/*uid=*/ 2L, currentUserId, /*uid=*/ 2L, currentUserId,
ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
/*backgroundUsageTimeInMs=*/ 20L); /*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
entryMap.put(entry.getKey(), entry); entryMap.put(entry.getKey(), entry);
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap); batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay = final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
@@ -1603,6 +1611,93 @@ public final class DataProcessorTest {
assertThat(DataProcessor.getScreenOnTime(appUsageMap, userId, packageName)).isEqualTo(0); assertThat(DataProcessor.getScreenOnTime(appUsageMap, userId, packageName)).isEqualTo(0);
} }
@Test
public void needsCombineInSystemApp_isHidden_returnTrue() {
final int currentUserId = mContext.getUserId();
final BatteryHistEntry hiddenHistEntry = createBatteryHistEntry(
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, true);
final BatteryDiffEntry hiddenDiffEntry = new BatteryDiffEntry(
mContext,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0,
/*screenOnTimeInMs=*/ 0,
/*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0,
hiddenHistEntry);
boolean needsCombineInSystemApp = DataProcessor.needsCombineInSystemApp(
hiddenDiffEntry, List.of(), mApplicationsState);
assertThat(needsCombineInSystemApp).isTrue();
}
@Test
public void needsCombineInSystemApp_isSystemApp_returnTrue() {
final int currentUserId = mContext.getUserId();
final BatteryHistEntry batteryHistEntry = createBatteryHistEntry(
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, false);
final BatteryDiffEntry batteryDiffEntry = new BatteryDiffEntry(
mContext,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0,
/*screenOnTimeInMs=*/ 0,
/*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0,
batteryHistEntry);
doReturn(mAppEntry).when(mApplicationsState).getEntry(anyString(), anyInt());
mAppEntry.info = mApplicationInfo;
mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
boolean needsCombineInSystemApp = DataProcessor.needsCombineInSystemApp(
batteryDiffEntry, List.of(), mApplicationsState);
assertThat(needsCombineInSystemApp).isTrue();
}
@Test
public void needsCombineInSystemApp_notSystemApp_returnFalse() {
final int currentUserId = mContext.getUserId();
final BatteryHistEntry batteryHistEntry = createBatteryHistEntry(
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, false);
final BatteryDiffEntry batteryDiffEntry = new BatteryDiffEntry(
mContext,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0,
/*screenOnTimeInMs=*/ 0,
/*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0,
batteryHistEntry);
doReturn(mAppEntry).when(mApplicationsState).getEntry(anyString(), anyInt());
mAppEntry.info = mApplicationInfo;
mApplicationInfo.flags = 0;
boolean needsCombineInSystemApp = DataProcessor.needsCombineInSystemApp(
batteryDiffEntry, List.of(), mApplicationsState);
assertThat(needsCombineInSystemApp).isFalse();
}
private static Map<Long, Map<String, BatteryHistEntry>> createHistoryMap( private static Map<Long, Map<String, BatteryHistEntry>> createHistoryMap(
final long[] timestamps, final int[] levels) { final long[] timestamps, final int[] levels) {
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>(); final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
@@ -1639,7 +1734,8 @@ public final class DataProcessorTest {
final double foregroundServiceUsageConsumePower, final double foregroundServiceUsageConsumePower,
final double backgroundUsageConsumePower, final double cachedUsageConsumePower, final double backgroundUsageConsumePower, final double cachedUsageConsumePower,
final long uid, final long userId, final int consumerType, final long uid, final long userId, final int consumerType,
final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs) { final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs,
final boolean isHidden) {
// Only insert required fields. // Only insert required fields.
final BatteryInformation batteryInformation = final BatteryInformation batteryInformation =
BatteryInformation BatteryInformation
@@ -1652,6 +1748,7 @@ public final class DataProcessorTest {
.setCachedUsageConsumePower(cachedUsageConsumePower) .setCachedUsageConsumePower(cachedUsageConsumePower)
.setForegroundUsageTimeInMs(foregroundUsageTimeInMs) .setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
.setBackgroundUsageTimeInMs(backgroundUsageTimeInMs) .setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
.setIsHidden(isHidden)
.build(); .build();
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(BatteryHistEntry.KEY_PACKAGE_NAME, packageName); values.put(BatteryHistEntry.KEY_PACKAGE_NAME, packageName);