Snap for 7292112 from 5aa3c23535 to sc-release

Change-Id: I9241ab4478d67bdde10c56a72d2a658c6a76013f
This commit is contained in:
android-build-team Robot
2021-04-17 23:08:15 +00:00
5 changed files with 151 additions and 7 deletions

View File

@@ -152,7 +152,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
mBatteryIndexedMap = mBatteryIndexedMap =
ConvertUtils.getIndexedUsageMap( ConvertUtils.getIndexedUsageMap(
mPrefContext, /*timeSlotSize=*/ CHART_LEVEL_ARRAY_SIZE - 1, mPrefContext, /*timeSlotSize=*/ CHART_LEVEL_ARRAY_SIZE - 1,
mBatteryHistoryKeys, batteryHistoryMap); mBatteryHistoryKeys, batteryHistoryMap,
/*purgeLowPercentageData=*/ true);
forceRefreshUi(); forceRefreshUi();
Log.d(TAG, String.format( Log.d(TAG, String.format(

View File

@@ -20,6 +20,9 @@ import android.content.pm.PackageInfo;
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.UserManager;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -51,6 +54,7 @@ public final class BatteryDiffEntry {
private double mPercentOfTotal; private double mPercentOfTotal;
private Context mContext; private Context mContext;
private UserManager mUserManager;
private String mDefaultPackageName = null; private String mDefaultPackageName = null;
@VisibleForTesting String mAppLabel = null; @VisibleForTesting String mAppLabel = null;
@@ -68,6 +72,7 @@ public final class BatteryDiffEntry {
mForegroundUsageTimeInMs = foregroundUsageTimeInMs; mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
mBackgroundUsageTimeInMs = backgroundUsageTimeInMs; mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
mBatteryHistEntry = batteryHistEntry; mBatteryHistEntry = batteryHistEntry;
mUserManager = context.getSystemService(UserManager.class);
} }
/** Sets the total consumed power in a specific time slot. */ /** Sets the total consumed power in a specific time slot. */
@@ -112,6 +117,19 @@ public final class BatteryDiffEntry {
return mDefaultPackageName; return mDefaultPackageName;
} }
/** Whether the current BatteryDiffEntry is system component or not. */
public boolean isSystemEntry() {
switch (mBatteryHistEntry.mConsumerType) {
case ConvertUtils.CONSUMER_TYPE_USER_BATTERY:
case ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY:
return true;
case ConvertUtils.CONSUMER_TYPE_UID_BATTERY:
return isSystemUid((int) mBatteryHistEntry.mUid)
|| mBatteryHistEntry.mIsHidden;
}
return false;
}
private void loadLabelAndIcon() { private void loadLabelAndIcon() {
if (mIsLoaded) { if (mIsLoaded) {
return; return;
@@ -151,7 +169,9 @@ public final class BatteryDiffEntry {
if (mAppIcon == null) { if (mAppIcon == null) {
mAppIcon = mContext.getPackageManager().getDefaultActivityIcon(); mAppIcon = mContext.getPackageManager().getDefaultActivityIcon();
} }
if (mAppLabel != null && mAppIcon != null) { // Adds badge icon into app icon for work profile.
mAppIcon = getBadgeIconForUser(mAppIcon);
if (mAppLabel != null || mAppIcon != null) {
sResourceCache.put( sResourceCache.put(
mBatteryHistEntry.getKey(), mBatteryHistEntry.getKey(),
new BatteryEntry.NameAndIcon(mAppLabel, mAppIcon, /*iconId=*/ 0)); new BatteryEntry.NameAndIcon(mAppLabel, mAppIcon, /*iconId=*/ 0));
@@ -235,6 +255,17 @@ public final class BatteryDiffEntry {
sResourceCache.clear(); sResourceCache.clear();
} }
private Drawable getBadgeIconForUser(Drawable icon) {
final int userId = UserHandle.getUserId((int) mBatteryHistEntry.mUid);
final UserHandle userHandle = new UserHandle(userId);
return mUserManager.getBadgedIconForUser(icon, userHandle);
}
private static boolean isSystemUid(int uid) {
final int appUid = UserHandle.getAppId(uid);
return appUid >= Process.SYSTEM_UID && appUid < Process.FIRST_APPLICATION_UID;
}
private static <T> T getNonNull(T originalObj, T newObj) { private static <T> T getNonNull(T originalObj, T newObj) {
return newObj != null ? newObj : originalObj; return newObj != null ? newObj : originalObj;
} }

View File

@@ -24,6 +24,8 @@ import android.os.UserBatteryConsumer;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@@ -31,6 +33,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@@ -44,6 +47,9 @@ public final class ConvertUtils {
private static final BatteryHistEntry EMPTY_BATTERY_HIST_ENTRY = private static final BatteryHistEntry EMPTY_BATTERY_HIST_ENTRY =
new BatteryHistEntry(new ContentValues()); new BatteryHistEntry(new ContentValues());
@VisibleForTesting
static double PERCENTAGE_OF_TOTAL_THRESHOLD = 1f;
/** Invalid system battery consumer drain type. */ /** Invalid system battery consumer drain type. */
public static final int INVALID_DRAIN_TYPE = -1; public static final int INVALID_DRAIN_TYPE = -1;
/** A fake package name to represent no BatteryEntry data. */ /** A fake package name to represent no BatteryEntry data. */
@@ -142,7 +148,8 @@ public final class ConvertUtils {
final Context context, final Context context,
final int timeSlotSize, final int timeSlotSize,
final long[] batteryHistoryKeys, final long[] batteryHistoryKeys,
final Map<Long, List<BatteryHistEntry>> batteryHistoryMap) { final Map<Long, List<BatteryHistEntry>> batteryHistoryMap,
final boolean purgeLowPercentageData) {
final Map<Integer, List<BatteryDiffEntry>> resultMap = new HashMap<>(); final Map<Integer, List<BatteryDiffEntry>> resultMap = new HashMap<>();
// Generates a temporary map to calculate diff usage data, which converts the inputted // Generates a temporary map to calculate diff usage data, which converts the inputted
// List<BatteryDiffEntry> into Map<String, BatteryHistEntry> with the key comes from // List<BatteryDiffEntry> into Map<String, BatteryHistEntry> with the key comes from
@@ -248,6 +255,9 @@ public final class ConvertUtils {
} }
} }
insert24HoursData(BatteryChartView.SELECTED_INDEX_ALL, resultMap); insert24HoursData(BatteryChartView.SELECTED_INDEX_ALL, resultMap);
if (purgeLowPercentageData) {
purgeLowPercentageData(resultMap);
}
return resultMap; return resultMap;
} }
@@ -283,6 +293,19 @@ public final class ConvertUtils {
indexedUsageMap.put(Integer.valueOf(desiredIndex), resultList); indexedUsageMap.put(Integer.valueOf(desiredIndex), resultList);
} }
private static void purgeLowPercentageData(
final Map<Integer, List<BatteryDiffEntry>> indexedUsageMap) {
for (List<BatteryDiffEntry> entries : indexedUsageMap.values()) {
final Iterator<BatteryDiffEntry> iterator = entries.iterator();
while (iterator.hasNext()) {
final BatteryDiffEntry entry = iterator.next();
if (entry.getPercentOfTotal() < PERCENTAGE_OF_TOTAL_THRESHOLD) {
iterator.remove();
}
}
}
}
private static long getDiffValue(long v1, long v2, long v3) { private static long getDiffValue(long v1, long v2, long v3) {
return (v2 > v1 ? v2 - v1 : 0) + (v3 > v2 ? v3 - v2 : 0); return (v2 > v1 ? v2 - v1 : 0) + (v3 > v2 ? v3 - v2 : 0);
} }

View File

@@ -28,6 +28,7 @@ import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.SystemBatteryConsumer; import android.os.SystemBatteryConsumer;
import android.os.UserManager; import android.os.UserManager;
import android.os.UserHandle;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -52,6 +53,7 @@ public final class BatteryDiffEntryTest {
@Mock private UserManager mockUserManager; @Mock private UserManager mockUserManager;
@Mock private Drawable mockDrawable; @Mock private Drawable mockDrawable;
@Mock private Drawable mockDrawable2; @Mock private Drawable mockDrawable2;
@Mock private Drawable mockBadgedDrawable;
@Before @Before
public void setUp() { public void setUp() {
@@ -209,21 +211,29 @@ public final class BatteryDiffEntryTest {
public void testGetAppIcon_uidConsumerWithNullIcon_returnDefaultActivityIcon() public void testGetAppIcon_uidConsumerWithNullIcon_returnDefaultActivityIcon()
throws Exception { throws Exception {
final BatteryDiffEntry entry = createBatteryDiffEntry(mockDrawable); final BatteryDiffEntry entry = createBatteryDiffEntry(mockDrawable);
final int userId = UserHandle.getUserId(1001);
doReturn(mockBadgedDrawable).when(mockUserManager)
.getBadgedIconForUser(mockDrawable, new UserHandle(userId));
entry.mAppIcon = null; entry.mAppIcon = null;
assertThat(entry.getAppIcon()).isEqualTo(mockDrawable); assertThat(entry.getAppIcon()).isEqualTo(mockBadgedDrawable);
assertThat(BatteryDiffEntry.sResourceCache).hasSize(1); assertThat(BatteryDiffEntry.sResourceCache).hasSize(1);
// Verifies the app label in the cache. // Verifies the app label in the cache.
final BatteryEntry.NameAndIcon nameAndIcon = final BatteryEntry.NameAndIcon nameAndIcon =
BatteryDiffEntry.sResourceCache.get(entry.mBatteryHistEntry.getKey()); BatteryDiffEntry.sResourceCache.get(entry.mBatteryHistEntry.getKey());
assertThat(nameAndIcon.icon).isEqualTo(mockDrawable); assertThat(nameAndIcon.icon).isEqualTo(mockBadgedDrawable);
} }
@Test @Test
public void testClearCache_switchLocale_clearCacheIconAndLabel() throws Exception { public void testClearCache_switchLocale_clearCacheIconAndLabel() throws Exception {
final int userId = UserHandle.getUserId(1001);
doReturn(mockBadgedDrawable).when(mockUserManager)
.getBadgedIconForUser(mockDrawable, new UserHandle(userId));
doReturn(mockDrawable2).when(mockUserManager)
.getBadgedIconForUser(mockDrawable2, new UserHandle(userId));
Locale.setDefault(new Locale("en_US")); Locale.setDefault(new Locale("en_US"));
final BatteryDiffEntry entry1 = createBatteryDiffEntry(mockDrawable); final BatteryDiffEntry entry1 = createBatteryDiffEntry(mockDrawable);
assertThat(entry1.getAppIcon()).isEqualTo(mockDrawable); assertThat(entry1.getAppIcon()).isEqualTo(mockBadgedDrawable);
// Switch the locale into another one. // Switch the locale into another one.
Locale.setDefault(new Locale("zh_TW")); Locale.setDefault(new Locale("zh_TW"));
@@ -237,6 +247,64 @@ public final class BatteryDiffEntryTest {
assertThat(nameAndIcon.icon).isEqualTo(mockDrawable2); assertThat(nameAndIcon.icon).isEqualTo(mockDrawable2);
} }
@Test
public void testIsSystemEntry_userBattery_returnTrue() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_USER_BATTERY,
/*uid=*/ 0, /*isHidden=*/ false);
assertThat(entry.isSystemEntry()).isTrue();
}
@Test
public void testIsSystemEntry_systemBattery_returnTrue() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY,
/*uid=*/ 0, /*isHidden=*/ false);
assertThat(entry.isSystemEntry()).isTrue();
}
@Test
public void testIsSystemEntry_uidBattery_returnFalse() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*uid=*/ 123, /*isHidden=*/ false);
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
public void testIsSystemEntry_uidBatteryWithSystemProcess_returnTrue() {
final BatteryDiffEntry entry =
createBatteryDiffEntry(
ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*uid=*/ 1230, /*isHidden=*/ false);
assertThat(entry.isSystemEntry()).isTrue();
}
private BatteryDiffEntry createBatteryDiffEntry(
int consumerType, long uid, boolean isHidden) {
final ContentValues values = getContentValuesWithType(consumerType);
values.put("isHidden", isHidden);
values.put("uid", uid);
return new BatteryDiffEntry(
mContext,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0,
/*consumePower=*/ 0,
new BatteryHistEntry(values));
}
private BatteryDiffEntry createBatteryDiffEntry( private BatteryDiffEntry createBatteryDiffEntry(
double consumePower, BatteryHistEntry batteryHistEntry) { double consumePower, BatteryHistEntry batteryHistEntry) {
final BatteryDiffEntry entry = new BatteryDiffEntry( final BatteryDiffEntry entry = new BatteryDiffEntry(

View File

@@ -212,7 +212,8 @@ public final class ConvertUtilsTest {
final Map<Integer, List<BatteryDiffEntry>> resultMap = final Map<Integer, List<BatteryDiffEntry>> resultMap =
ConvertUtils.getIndexedUsageMap( ConvertUtils.getIndexedUsageMap(
mContext, timeSlotSize, batteryHistoryKeys, batteryHistoryMap); mContext, timeSlotSize, batteryHistoryKeys, batteryHistoryMap,
/*purgeLowPercentageData=*/ false);
assertThat(resultMap).hasSize(3); assertThat(resultMap).hasSize(3);
// Verifies the first timestamp result. // Verifies the first timestamp result.
@@ -231,6 +232,26 @@ public final class ConvertUtilsTest {
assertBatteryDiffEntry(entryList.get(1), 4, 5L, 5L); assertBatteryDiffEntry(entryList.get(1), 4, 5L, 5L);
assertBatteryDiffEntry(entryList.get(2), 68, 40L, 50L); assertBatteryDiffEntry(entryList.get(2), 68, 40L, 50L);
assertBatteryDiffEntry(entryList.get(0), 27, 30L, 40L); assertBatteryDiffEntry(entryList.get(0), 27, 30L, 40L);
// Test getIndexedUsageMap() with purged data.
ConvertUtils.PERCENTAGE_OF_TOTAL_THRESHOLD = 50;
final Map<Integer, List<BatteryDiffEntry>> purgedResultMap =
ConvertUtils.getIndexedUsageMap(
mContext, timeSlotSize, batteryHistoryKeys, batteryHistoryMap,
/*purgeLowPercentageData=*/ true);
assertThat(purgedResultMap).hasSize(3);
// Verifies the first timestamp result.
entryList = purgedResultMap.get(Integer.valueOf(0));
assertThat(entryList).hasSize(1);
// Verifies the second timestamp result.
entryList = purgedResultMap.get(Integer.valueOf(1));
assertThat(entryList).hasSize(1);
assertBatteryDiffEntry(entryList.get(0), 75, 40L, 50L);
// Verifies the last 24 hours aggregate result.
entryList = purgedResultMap.get(Integer.valueOf(-1));
assertThat(entryList).hasSize(1);
assertBatteryDiffEntry(entryList.get(0), 68, 40L, 50L);
} }
private static BatteryHistEntry createBatteryHistEntry( private static BatteryHistEntry createBatteryHistEntry(