Merge "Put Android Core Apps under System apps" into udc-dev am: db7e7d0920

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/21983043

Change-Id: I67456274cd18c338c87b9ab560e3e0e0b918ae7d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2023-03-14 08:41:53 +00:00
committed by Automerger Merge Worker
6 changed files with 88 additions and 59 deletions

View File

@@ -42,7 +42,8 @@ public class BatteryDiffData {
final Context context,
final @NonNull List<BatteryDiffEntry> appDiffEntries,
final @NonNull List<BatteryDiffEntry> systemDiffEntries,
final Set<String> systemAppsSet,
final @NonNull Set<String> systemAppsPackageNames,
final @NonNull Set<Integer> systemAppsUids,
final boolean isAccumulated) {
mAppEntries = appDiffEntries;
mSystemEntries = systemDiffEntries;
@@ -51,7 +52,8 @@ public class BatteryDiffData {
final PowerUsageFeatureProvider featureProvider =
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
purgeBatteryDiffData(featureProvider);
combineBatteryDiffEntry(context, featureProvider, systemAppsSet);
combineBatteryDiffEntry(
context, featureProvider, systemAppsPackageNames, systemAppsUids);
}
processAndSortEntries(mAppEntries);
@@ -73,9 +75,13 @@ public class BatteryDiffData {
}
/** Combines into SystemAppsBatteryDiffEntry and OthersBatteryDiffEntry. */
private void combineBatteryDiffEntry(final Context context,
final PowerUsageFeatureProvider featureProvider, final Set<String> systemAppsSet) {
combineIntoSystemApps(context, featureProvider, systemAppsSet, mAppEntries);
private void combineBatteryDiffEntry(
final Context context,
final PowerUsageFeatureProvider featureProvider,
final @NonNull Set<String> systemAppsPackageNames,
final @NonNull Set<Integer> systemAppsUids) {
combineIntoSystemApps(
context, featureProvider, systemAppsPackageNames, systemAppsUids, mAppEntries);
combineSystemItemsIntoOthers(context, featureProvider, mSystemEntries);
}
@@ -113,14 +119,16 @@ public class BatteryDiffData {
private static void combineIntoSystemApps(
final Context context,
final PowerUsageFeatureProvider featureProvider,
final Set<String> systemAppsSet,
final List<BatteryDiffEntry> appEntries) {
final @NonNull Set<String> systemAppsPackageNames,
final @NonNull Set<Integer> systemAppsUids,
final @NonNull List<BatteryDiffEntry> appEntries) {
final List<String> systemAppsAllowlist = featureProvider.getSystemAppsAllowlist();
BatteryDiffEntry.SystemAppsBatteryDiffEntry systemAppsDiffEntry = null;
final Iterator<BatteryDiffEntry> appListIterator = appEntries.iterator();
while (appListIterator.hasNext()) {
final BatteryDiffEntry batteryDiffEntry = appListIterator.next();
if (needsCombineInSystemApp(batteryDiffEntry, systemAppsAllowlist, systemAppsSet)) {
if (needsCombineInSystemApp(batteryDiffEntry, systemAppsAllowlist,
systemAppsPackageNames, systemAppsUids)) {
if (systemAppsDiffEntry == null) {
systemAppsDiffEntry = new BatteryDiffEntry.SystemAppsBatteryDiffEntry(context);
}
@@ -168,8 +176,11 @@ public class BatteryDiffData {
}
@VisibleForTesting
static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry,
final List<String> systemAppsAllowlist, final Set<String> systemAppsSet) {
static boolean needsCombineInSystemApp(
final BatteryDiffEntry batteryDiffEntry,
final @NonNull List<String> systemAppsAllowlist,
final @NonNull Set<String> systemAppsPackageNames,
final @NonNull Set<Integer> systemAppsUids) {
if (batteryDiffEntry.mBatteryHistEntry.mIsHidden) {
return true;
}
@@ -179,11 +190,12 @@ public class BatteryDiffData {
return false;
}
if (systemAppsAllowlist != null && systemAppsAllowlist.contains(packageName)) {
if (systemAppsAllowlist.contains(packageName)) {
return true;
}
return systemAppsSet != null && systemAppsSet.contains(packageName);
int uid = (int) batteryDiffEntry.mBatteryHistEntry.mUid;
return systemAppsPackageNames.contains(packageName) || systemAppsUids.contains(uid);
}
/**

View File

@@ -61,7 +61,6 @@ import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -84,7 +83,8 @@ public final class DataProcessor {
private static final float TOTAL_HOURLY_TIME_THRESHOLD = DateUtils.HOUR_IN_MILLIS * 2;
private static final long MIN_TIME_SLOT = DateUtils.HOUR_IN_MILLIS * 2;
private static final String MEDIASERVER_PACKAGE_NAME = "mediaserver";
private static final Map<String, BatteryHistEntry> EMPTY_BATTERY_MAP = new HashMap<>();
private static final String ANDROID_CORE_APPS_SHARED_USER_ID = "android.uid.shared";
private static final Map<String, BatteryHistEntry> EMPTY_BATTERY_MAP = new ArrayMap<>();
private static final BatteryHistEntry EMPTY_BATTERY_HIST_ENTRY =
new BatteryHistEntry(new ContentValues());
@@ -102,7 +102,7 @@ public final class DataProcessor {
static long sTestCurrentTimeMillis = 0;
@VisibleForTesting
static Set<String> sTestSystemAppsSet;
static Set<String> sTestSystemAppsPackageNames;
@VisibleForTesting
static IUsageStatsManager sUsageStatsManager =
@@ -185,7 +185,7 @@ public final class DataProcessor {
if (context == null) {
return null;
}
final Map<Long, UsageEvents> resultMap = new HashMap();
final Map<Long, UsageEvents> resultMap = new ArrayMap();
final UserManager userManager = context.getSystemService(UserManager.class);
if (userManager == null) {
return null;
@@ -276,12 +276,12 @@ public final class DataProcessor {
// distribution.
Collections.sort(appUsageEventList, TIMESTAMP_COMPARATOR);
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>> resultMap =
new HashMap<>();
new ArrayMap<>();
final long dailySize = hourlyBatteryLevelsPerDay.size();
for (int dailyIndex = 0; dailyIndex < hourlyBatteryLevelsPerDay.size(); dailyIndex++) {
final Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>> dailyMap =
new HashMap<>();
new ArrayMap<>();
resultMap.put(dailyIndex, dailyMap);
if (hourlyBatteryLevelsPerDay.get(dailyIndex) == null) {
continue;
@@ -391,7 +391,7 @@ public final class DataProcessor {
if (appUsagePeriodMap == null) {
return null;
}
final Map<Integer, Map<Integer, Long>> deviceScreenOnTime = new HashMap<>();
final Map<Integer, Map<Integer, Long>> deviceScreenOnTime = new ArrayMap<>();
insertHourlyDeviceScreenOnTime(appUsagePeriodMap, deviceScreenOnTime);
insertDailyDeviceScreenOnTime(appUsagePeriodMap, deviceScreenOnTime);
insertAllDeviceScreenOnTime(deviceScreenOnTime);
@@ -433,7 +433,7 @@ public final class DataProcessor {
final Context context) {
final List<BatteryHistEntry> batteryHistEntryList =
getBatteryHistListFromFromStatsService(context);
return batteryHistEntryList == null ? new HashMap<>()
return batteryHistEntryList == null ? new ArrayMap<>()
: batteryHistEntryList.stream().collect(Collectors.toMap(e -> e.getKey(), e -> e));
}
@@ -441,14 +441,14 @@ public final class DataProcessor {
* @return Returns the processed history map which has interpolated to every hour data.
* The start and end timestamp must be the even hours.
* The keys of processed history map should contain every hour between the start and end
* timestamp. If there's no data in some key, the value will be the empty hashmap.
* timestamp. If there's no data in some key, the value will be the empty map.
*/
static Map<Long, Map<String, BatteryHistEntry>> getHistoryMapWithExpectedTimestamps(
Context context,
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
final long startTime = System.currentTimeMillis();
final List<Long> rawTimestampList = new ArrayList<>(batteryHistoryMap.keySet());
final Map<Long, Map<String, BatteryHistEntry>> resultMap = new HashMap();
final Map<Long, Map<String, BatteryHistEntry>> resultMap = new ArrayMap();
if (rawTimestampList.isEmpty()) {
Log.d(TAG, "empty batteryHistoryMap in getHistoryMapWithExpectedTimestamps()");
return resultMap;
@@ -641,11 +641,12 @@ public final class DataProcessor {
if (batteryHistoryMap.isEmpty()) {
return null;
}
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap = new HashMap<>();
final Set<String> systemAppsSet = getSystemAppsSet(context);
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap = new ArrayMap<>();
final Set<String> systemAppsPackageNames = getSystemAppsPackageNames(context);
final Set<Integer> systemAppsUids = getSystemAppsUids(context);
// Insert diff data from [0][0] to [maxDailyIndex][maxHourlyIndex].
insertHourlyUsageDiffData(context, systemAppsSet, hourlyBatteryLevelsPerDay,
batteryHistoryMap, appUsagePeriodMap, resultMap);
insertHourlyUsageDiffData(context, systemAppsPackageNames, systemAppsUids,
hourlyBatteryLevelsPerDay, batteryHistoryMap, appUsagePeriodMap, resultMap);
// Insert diff data from [0][SELECTED_INDEX_ALL] to [maxDailyIndex][SELECTED_INDEX_ALL].
insertDailyUsageDiffData(context, hourlyBatteryLevelsPerDay, resultMap);
// Insert diff data [SELECTED_INDEX_ALL][SELECTED_INDEX_ALL].
@@ -704,9 +705,10 @@ public final class DataProcessor {
return null;
}
final Set<String> systemAppsSet = getSystemAppsSet(context);
return new BatteryDiffData(
context, appEntries, systemEntries, systemAppsSet, /* isAccumulated= */ false);
final Set<String> systemAppsPackageNames = getSystemAppsPackageNames(context);
final Set<Integer> systemAppsUids = getSystemAppsUids(context);
return new BatteryDiffData(context, appEntries, systemEntries,
systemAppsPackageNames, systemAppsUids, /* isAccumulated= */ false);
}
/**
@@ -743,7 +745,7 @@ public final class DataProcessor {
return null;
}
final Map<Long, Map<String, List<AppUsagePeriod>>> allUsagePeriods = new HashMap<>();
final Map<Long, Map<String, List<AppUsagePeriod>>> allUsagePeriods = new ArrayMap<>();
for (int i = 0; i < usageEventsByInstanceId.size(); i++) {
// The usage periods for an instance are determined by the usage events with its
@@ -855,8 +857,8 @@ public final class DataProcessor {
*/
static Map<Integer, Map<Integer, BatteryDiffData>> getBatteryUsageMapFromStatsService(
final Context context) {
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap = new HashMap<>();
final Map<Integer, BatteryDiffData> allUsageMap = new HashMap<>();
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap = new ArrayMap<>();
final Map<Integer, BatteryDiffData> allUsageMap = new ArrayMap<>();
// Always construct the map whether the value is null or not.
allUsageMap.put(SELECTED_INDEX_ALL,
generateBatteryDiffData(context, getBatteryHistListFromFromStatsService(context)));
@@ -937,7 +939,7 @@ public final class DataProcessor {
final List<AppUsagePeriod> usagePeriodList,
final long userId,
final String packageName) {
usagePeriodMap.computeIfAbsent(userId, key -> new HashMap<>());
usagePeriodMap.computeIfAbsent(userId, key -> new ArrayMap<>());
final Map<String, List<AppUsagePeriod>> packageNameMap = usagePeriodMap.get(userId);
packageNameMap.computeIfAbsent(packageName, key -> new ArrayList<>());
packageNameMap.get(packageName).addAll(usagePeriodList);
@@ -968,7 +970,7 @@ public final class DataProcessor {
for (final int dailyIndex : appUsagePeriodMap.keySet()) {
final Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>> dailyAppUsageMap =
appUsagePeriodMap.get(dailyIndex);
final Map<Integer, Long> dailyScreenOnTime = new HashMap<>();
final Map<Integer, Long> dailyScreenOnTime = new ArrayMap<>();
resultMap.put(dailyIndex, dailyScreenOnTime);
if (dailyAppUsageMap == null) {
continue;
@@ -1009,7 +1011,7 @@ public final class DataProcessor {
for (final int dailyIndex : appUsagePeriodMap.keySet()) {
Map<Integer, Long> dailyResultMap = resultMap.get(dailyIndex);
if (dailyResultMap == null) {
dailyResultMap = new HashMap<>();
dailyResultMap = new ArrayMap<>();
resultMap.put(dailyIndex, dailyResultMap);
}
dailyResultMap.put(
@@ -1020,10 +1022,10 @@ public final class DataProcessor {
private static void insertAllDeviceScreenOnTime(
final Map<Integer, Map<Integer, Long>> resultMap) {
final Map<Integer, Long> dailyAllMap = new HashMap<>();
final Map<Integer, Long> dailyAllMap = new ArrayMap<>();
resultMap.keySet().forEach(
key -> dailyAllMap.put(key, resultMap.get(key).get(SELECTED_INDEX_ALL)));
final Map<Integer, Long> allUsageMap = new HashMap<>();
final Map<Integer, Long> allUsageMap = new ArrayMap<>();
allUsageMap.put(SELECTED_INDEX_ALL, getAccumulatedScreenOnTime(dailyAllMap));
resultMap.put(SELECTED_INDEX_ALL, allUsageMap);
}
@@ -1173,7 +1175,7 @@ public final class DataProcessor {
// Case 1: upper timestamp is zero since scheduler is delayed!
if (upperTimestamp == 0) {
log(context, "job scheduler is delayed", currentSlot, null);
resultMap.put(currentSlot, new HashMap<>());
resultMap.put(currentSlot, new ArrayMap<>());
return;
}
// Case 2: upper timestamp is closed to the current timestamp.
@@ -1186,7 +1188,7 @@ public final class DataProcessor {
// Case 3: lower timestamp is zero before starting to collect data.
if (lowerTimestamp == 0) {
log(context, "no lower timestamp slot data", currentSlot, null);
resultMap.put(currentSlot, new HashMap<>());
resultMap.put(currentSlot, new ArrayMap<>());
return;
}
interpolateHistoryForSlot(context,
@@ -1222,12 +1224,12 @@ public final class DataProcessor {
resultMap.put(currentSlot, upperEntryDataMap);
} else {
log(context, "in the different booting section", currentSlot, null);
resultMap.put(currentSlot, new HashMap<>());
resultMap.put(currentSlot, new ArrayMap<>());
}
return;
}
log(context, "apply interpolation arithmetic", currentSlot, null);
final Map<String, BatteryHistEntry> newHistEntryMap = new HashMap<>();
final Map<String, BatteryHistEntry> newHistEntryMap = new ArrayMap<>();
final double timestampLength = upperTimestamp - lowerTimestamp;
final double timestampDiff = currentSlot - lowerTimestamp;
// Applies interpolation arithmetic for each BatteryHistEntry.
@@ -1374,7 +1376,8 @@ public final class DataProcessor {
private static void insertHourlyUsageDiffData(
Context context,
final Set<String> systemAppsSet,
final Set<String> systemAppsPackageNames,
final Set<Integer> systemAppsUids,
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay,
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap,
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
@@ -1390,7 +1393,7 @@ public final class DataProcessor {
// Math.abs(timestamp[i+1] data - timestamp[i] data);
// since we want to aggregate every two hours data into a single time slot.
for (int dailyIndex = 0; dailyIndex < hourlyBatteryLevelsPerDay.size(); dailyIndex++) {
final Map<Integer, BatteryDiffData> dailyDiffMap = new HashMap<>();
final Map<Integer, BatteryDiffData> dailyDiffMap = new ArrayMap<>();
resultMap.put(dailyIndex, dailyDiffMap);
if (hourlyBatteryLevelsPerDay.get(dailyIndex) == null) {
continue;
@@ -1404,7 +1407,8 @@ public final class DataProcessor {
workProfileUserId,
hourlyIndex,
timestamps,
systemAppsSet,
systemAppsPackageNames,
systemAppsUids,
appUsagePeriodMap == null
|| appUsagePeriodMap.get(dailyIndex) == null
? null
@@ -1422,7 +1426,7 @@ public final class DataProcessor {
for (int index = 0; index < hourlyBatteryLevelsPerDay.size(); index++) {
Map<Integer, BatteryDiffData> dailyUsageMap = resultMap.get(index);
if (dailyUsageMap == null) {
dailyUsageMap = new HashMap<>();
dailyUsageMap = new ArrayMap<>();
resultMap.put(index, dailyUsageMap);
}
dailyUsageMap.put(
@@ -1437,7 +1441,7 @@ public final class DataProcessor {
final List<BatteryDiffData> diffDataList = new ArrayList<>();
resultMap.keySet().forEach(
key -> diffDataList.add(resultMap.get(key).get(SELECTED_INDEX_ALL)));
final Map<Integer, BatteryDiffData> allUsageMap = new HashMap<>();
final Map<Integer, BatteryDiffData> allUsageMap = new ArrayMap<>();
allUsageMap.put(SELECTED_INDEX_ALL, getAccumulatedUsageDiffData(context, diffDataList));
resultMap.put(SELECTED_INDEX_ALL, allUsageMap);
}
@@ -1449,7 +1453,8 @@ public final class DataProcessor {
final int workProfileUserId,
final int currentIndex,
final List<Long> timestamps,
final Set<String> systemAppsSet,
final Set<String> systemAppsPackageNames,
final Set<Integer> systemAppsUids,
final Map<Long, Map<String, List<AppUsagePeriod>>> appUsageMap,
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
final List<BatteryDiffEntry> appEntries = new ArrayList<>();
@@ -1603,8 +1608,8 @@ public final class DataProcessor {
return null;
}
return new BatteryDiffData(
context, appEntries, systemEntries, systemAppsSet, /* isAccumulated= */ false);
return new BatteryDiffData(context, appEntries, systemEntries,
systemAppsPackageNames, systemAppsUids, /* isAccumulated= */ false);
}
private static long getScreenOnTime(@Nullable final List<AppUsagePeriod> appUsagePeriodList) {
@@ -1662,7 +1667,7 @@ public final class DataProcessor {
@Nullable
private static BatteryDiffData getAccumulatedUsageDiffData(
final Context context, final Collection<BatteryDiffData> diffEntryListData) {
final Map<String, BatteryDiffEntry> diffEntryMap = new HashMap<>();
final Map<String, BatteryDiffEntry> diffEntryMap = new ArrayMap<>();
final List<BatteryDiffEntry> appEntries = new ArrayList<>();
final List<BatteryDiffEntry> systemEntries = new ArrayList<>();
@@ -1688,7 +1693,8 @@ public final class DataProcessor {
}
return diffEntryList.isEmpty() ? null : new BatteryDiffData(context, appEntries,
systemEntries, /* systemAppsSet= */ null, /* isAccumulated= */ true);
systemEntries, /* systemAppsPackageNames= */ new ArraySet<>(),
/* systemAppsUids= */ new ArraySet<>(), /* isAccumulated= */ true);
}
private static void computeUsageDiffDataPerEntry(
@@ -1904,11 +1910,22 @@ public final class DataProcessor {
return null;
}
private static Set<String> getSystemAppsSet(Context context) {
return sTestSystemAppsSet != null ? sTestSystemAppsSet
private static Set<String> getSystemAppsPackageNames(Context context) {
return sTestSystemAppsPackageNames != null ? sTestSystemAppsPackageNames
: AppListRepositoryUtil.getSystemPackageNames(context, context.getUserId(), false);
}
private static Set<Integer> getSystemAppsUids(Context context) {
Set<Integer> result = new ArraySet<>();
try {
result.add(context.getPackageManager().getUidForSharedUser(
ANDROID_CORE_APPS_SHARED_USER_ID));
} catch (PackageManager.NameNotFoundException e) {
// No Android Core Apps
}
return result;
}
private static long getCurrentTimeMillis() {
return sTestCurrentTimeMillis > 0 ? sTestCurrentTimeMillis : System.currentTimeMillis();
}

View File

@@ -88,7 +88,7 @@ public final class BatteryChartPreferenceControllerTest {
Locale.setDefault(new Locale("en_US"));
org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false);
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
DataProcessor.sTestSystemAppsSet = Set.of();
DataProcessor.sTestSystemAppsPackageNames = Set.of();
mFeatureFactory = FakeFeatureFactory.setupForTest();
mContext = spy(RuntimeEnvironment.application);
doReturn(mContext).when(mContext).getApplicationContext();

View File

@@ -63,7 +63,7 @@ public class BatteryDiffDataTest {
createBatteryDiffEntry(mContext, /*consumePower=*/ 0, /*isHidden=*/ true);
final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
hiddenDiffEntry, List.of(), Set.of());
hiddenDiffEntry, List.of(), Set.of(), Set.of());
assertThat(needsCombineInSystemApp).isTrue();
}
@@ -77,7 +77,7 @@ public class BatteryDiffDataTest {
mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
batteryDiffEntry, List.of(), Set.of(ConvertUtils.FAKE_PACKAGE_NAME));
batteryDiffEntry, List.of(), Set.of(ConvertUtils.FAKE_PACKAGE_NAME), Set.of());
assertThat(needsCombineInSystemApp).isTrue();
}
@@ -91,7 +91,7 @@ public class BatteryDiffDataTest {
mApplicationInfo.flags = 0;
final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
batteryDiffEntry, List.of(), Set.of());
batteryDiffEntry, List.of(), Set.of(), Set.of());
assertThat(needsCombineInSystemApp).isFalse();
}

View File

@@ -107,7 +107,7 @@ public final class BatteryUsageBreakdownControllerTest {
mBatteryDiffEntry = spy(mBatteryDiffEntry);
mBatteryUsageBreakdownController.mBatteryDiffData =
new BatteryDiffData(mContext, Arrays.asList(mBatteryDiffEntry), Arrays.asList(),
Set.of(), /* isAccumulated= */ false);
Set.of(), Set.of(), /* isAccumulated= */ false);
// Adds fake testing data.
BatteryDiffEntry.sResourceCache.put(
"fakeBatteryDiffEntryKey",

View File

@@ -93,7 +93,7 @@ public final class DataProcessorTest {
mFeatureFactory = FakeFeatureFactory.setupForTest();
mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
DataProcessor.sTestSystemAppsSet = Set.of();
DataProcessor.sTestSystemAppsPackageNames = Set.of();
DataProcessor.sUsageStatsManager = mUsageStatsManager;
doReturn(mIntent).when(mContext).registerReceiver(
isA(BroadcastReceiver.class), isA(IntentFilter.class));