Merge "Fix b/265632782: Battery usage app list changed when entering the app details page and back"

This commit is contained in:
TreeHugger Robot
2023-01-17 03:44:51 +00:00
committed by Android (Google) Code Review
6 changed files with 43 additions and 35 deletions

View File

@@ -16,7 +16,6 @@
package com.android.settings.fuelgauge.batteryusage; package com.android.settings.fuelgauge.batteryusage;
import android.app.Application;
import android.content.Context; import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -24,7 +23,6 @@ import androidx.annotation.NonNull;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.ApplicationsState;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
@@ -41,6 +39,7 @@ public class BatteryDiffData {
final Context context, final Context context,
final @NonNull List<BatteryDiffEntry> appDiffEntries, final @NonNull List<BatteryDiffEntry> appDiffEntries,
final @NonNull List<BatteryDiffEntry> systemDiffEntries, final @NonNull List<BatteryDiffEntry> systemDiffEntries,
final Set<String> systemAppsSet,
final boolean isAccumulated) { final boolean isAccumulated) {
mAppEntries = appDiffEntries; mAppEntries = appDiffEntries;
mSystemEntries = systemDiffEntries; mSystemEntries = systemDiffEntries;
@@ -49,7 +48,7 @@ public class BatteryDiffData {
final PowerUsageFeatureProvider featureProvider = final PowerUsageFeatureProvider featureProvider =
FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
purgeBatteryDiffData(featureProvider); purgeBatteryDiffData(featureProvider);
combineBatteryDiffEntry(context, featureProvider); combineBatteryDiffEntry(context, featureProvider, systemAppsSet);
} }
setTotalConsumePower(); setTotalConsumePower();
@@ -71,9 +70,9 @@ public class BatteryDiffData {
} }
/** Combines into SystemAppsBatteryDiffEntry and OthersBatteryDiffEntry. */ /** Combines into SystemAppsBatteryDiffEntry and OthersBatteryDiffEntry. */
private void combineBatteryDiffEntry( private void combineBatteryDiffEntry(final Context context,
final Context context, final PowerUsageFeatureProvider featureProvider) { final PowerUsageFeatureProvider featureProvider, final Set<String> systemAppsSet) {
combineIntoSystemApps(context, featureProvider, mAppEntries); combineIntoSystemApps(context, featureProvider, systemAppsSet, mAppEntries);
combineSystemItemsIntoOthers(context, featureProvider, mSystemEntries); combineSystemItemsIntoOthers(context, featureProvider, mSystemEntries);
} }
@@ -119,17 +118,14 @@ public class BatteryDiffData {
private static void combineIntoSystemApps( private static void combineIntoSystemApps(
final Context context, final Context context,
final PowerUsageFeatureProvider featureProvider, final PowerUsageFeatureProvider featureProvider,
final Set<String> systemAppsSet,
final List<BatteryDiffEntry> appEntries) { final List<BatteryDiffEntry> appEntries) {
final List<String> systemAppsAllowlist = featureProvider.getSystemAppsAllowlist(); final List<String> systemAppsAllowlist = featureProvider.getSystemAppsAllowlist();
final Application application = (Application) context.getApplicationContext();
final ApplicationsState applicationsState =
application == null ? null : ApplicationsState.getInstance(application);
BatteryDiffEntry.SystemAppsBatteryDiffEntry systemAppsDiffEntry = null; BatteryDiffEntry.SystemAppsBatteryDiffEntry systemAppsDiffEntry = null;
final Iterator<BatteryDiffEntry> appListIterator = appEntries.iterator(); final Iterator<BatteryDiffEntry> appListIterator = appEntries.iterator();
while (appListIterator.hasNext()) { while (appListIterator.hasNext()) {
final BatteryDiffEntry batteryDiffEntry = appListIterator.next(); final BatteryDiffEntry batteryDiffEntry = appListIterator.next();
if (needsCombineInSystemApp(batteryDiffEntry, systemAppsAllowlist, applicationsState)) { if (needsCombineInSystemApp(batteryDiffEntry, systemAppsAllowlist, systemAppsSet)) {
if (systemAppsDiffEntry == null) { if (systemAppsDiffEntry == null) {
systemAppsDiffEntry = new BatteryDiffEntry.SystemAppsBatteryDiffEntry(context); systemAppsDiffEntry = new BatteryDiffEntry.SystemAppsBatteryDiffEntry(context);
} }
@@ -184,7 +180,7 @@ public class BatteryDiffData {
@VisibleForTesting @VisibleForTesting
static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry, static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry,
final List<String> systemAppsAllowlist, final ApplicationsState applicationsState) { final List<String> systemAppsAllowlist, final Set<String> systemAppsSet) {
if (batteryDiffEntry.mBatteryHistEntry.mIsHidden) { if (batteryDiffEntry.mBatteryHistEntry.mIsHidden) {
return true; return true;
} }
@@ -198,15 +194,6 @@ public class BatteryDiffData {
return true; return true;
} }
if (applicationsState == null) { return systemAppsSet != null && systemAppsSet.contains(packageName);
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);
} }
} }

View File

@@ -53,6 +53,8 @@ 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.fuelgauge.BatteryStatus; import com.android.settingslib.fuelgauge.BatteryStatus;
import com.android.settingslib.spaprivileged.model.app.AppListConfig;
import com.android.settingslib.spaprivileged.model.app.AppListRepositoryUtil;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
@@ -94,11 +96,14 @@ public final class DataProcessor {
@VisibleForTesting @VisibleForTesting
static final int SELECTED_INDEX_ALL = BatteryChartViewModel.SELECTED_INDEX_ALL; static final int SELECTED_INDEX_ALL = BatteryChartViewModel.SELECTED_INDEX_ALL;
@VisibleForTesting
static boolean sDebug = false;
@VisibleForTesting @VisibleForTesting
static long sFakeCurrentTimeMillis = 0; static long sFakeCurrentTimeMillis = 0;
@VisibleForTesting @VisibleForTesting
static boolean sDebug = false; static Set<String> sFakeSystemAppsSet;
@VisibleForTesting @VisibleForTesting
static IUsageStatsManager sUsageStatsManager = static IUsageStatsManager sUsageStatsManager =
@@ -633,10 +638,10 @@ public final class DataProcessor {
return null; return null;
} }
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap = new HashMap<>(); final Map<Integer, Map<Integer, BatteryDiffData>> resultMap = new HashMap<>();
final Set<String> systemAppsSet = getSystemAppsSet(context);
// Insert diff data from [0][0] to [maxDailyIndex][maxHourlyIndex]. // Insert diff data from [0][0] to [maxDailyIndex][maxHourlyIndex].
insertHourlyUsageDiffData( insertHourlyUsageDiffData(context, systemAppsSet, hourlyBatteryLevelsPerDay,
context, hourlyBatteryLevelsPerDay, batteryHistoryMap, appUsagePeriodMap, batteryHistoryMap, appUsagePeriodMap, resultMap);
resultMap);
// Insert diff data from [0][SELECTED_INDEX_ALL] to [maxDailyIndex][SELECTED_INDEX_ALL]. // Insert diff data from [0][SELECTED_INDEX_ALL] to [maxDailyIndex][SELECTED_INDEX_ALL].
insertDailyUsageDiffData(context, hourlyBatteryLevelsPerDay, resultMap); insertDailyUsageDiffData(context, hourlyBatteryLevelsPerDay, resultMap);
// Insert diff data [SELECTED_INDEX_ALL][SELECTED_INDEX_ALL]. // Insert diff data [SELECTED_INDEX_ALL][SELECTED_INDEX_ALL].
@@ -695,7 +700,9 @@ public final class DataProcessor {
return null; return null;
} }
return new BatteryDiffData(context, appEntries, systemEntries, /* isAccumulated= */ false); final Set<String> systemAppsSet = getSystemAppsSet(context);
return new BatteryDiffData(
context, appEntries, systemEntries, systemAppsSet, /* isAccumulated= */ false);
} }
/** /**
@@ -1363,6 +1370,7 @@ public final class DataProcessor {
private static void insertHourlyUsageDiffData( private static void insertHourlyUsageDiffData(
Context context, Context context,
final Set<String> systemAppsSet,
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay, final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay,
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap, final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap,
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>> final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
@@ -1392,6 +1400,7 @@ public final class DataProcessor {
workProfileUserId, workProfileUserId,
hourlyIndex, hourlyIndex,
timestamps, timestamps,
systemAppsSet,
appUsagePeriodMap == null appUsagePeriodMap == null
|| appUsagePeriodMap.get(dailyIndex) == null || appUsagePeriodMap.get(dailyIndex) == null
? null ? null
@@ -1436,6 +1445,7 @@ public final class DataProcessor {
final int workProfileUserId, final int workProfileUserId,
final int currentIndex, final int currentIndex,
final List<Long> timestamps, final List<Long> timestamps,
final Set<String> systemAppsSet,
final Map<Long, Map<String, List<AppUsagePeriod>>> appUsageMap, final Map<Long, Map<String, List<AppUsagePeriod>>> appUsageMap,
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) { final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
final List<BatteryDiffEntry> appEntries = new ArrayList<>(); final List<BatteryDiffEntry> appEntries = new ArrayList<>();
@@ -1589,7 +1599,8 @@ public final class DataProcessor {
return null; return null;
} }
return new BatteryDiffData(context, appEntries, systemEntries, /* isAccumulated= */ false); return new BatteryDiffData(
context, appEntries, systemEntries, systemAppsSet, /* isAccumulated= */ false);
} }
private static long getScreenOnTime(@Nullable final List<AppUsagePeriod> appUsagePeriodList) { private static long getScreenOnTime(@Nullable final List<AppUsagePeriod> appUsagePeriodList) {
@@ -1672,8 +1683,8 @@ public final class DataProcessor {
} }
} }
return diffEntryList.isEmpty() ? null : new BatteryDiffData( return diffEntryList.isEmpty() ? null : new BatteryDiffData(context, appEntries,
context, appEntries, systemEntries, /* isAccumulated= */ true); systemEntries, /* systemAppsSet= */ null, /* isAccumulated= */ true);
} }
private static void computeUsageDiffDataPerEntry( private static void computeUsageDiffDataPerEntry(
@@ -1889,6 +1900,12 @@ public final class DataProcessor {
return null; return null;
} }
private static Set<String> getSystemAppsSet(Context context) {
return sFakeSystemAppsSet != null ? sFakeSystemAppsSet
: AppListRepositoryUtil.getSystemPackageNames(context,
new AppListConfig(context.getUserId(), false));
}
private static long getCurrentTimeMillis() { private static long getCurrentTimeMillis() {
return sFakeCurrentTimeMillis > 0 ? sFakeCurrentTimeMillis : System.currentTimeMillis(); return sFakeCurrentTimeMillis > 0 ? sFakeCurrentTimeMillis : System.currentTimeMillis();
} }

View File

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

View File

@@ -38,6 +38,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import java.util.List; import java.util.List;
import java.util.Set;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class BatteryDiffDataTest { public class BatteryDiffDataTest {
@@ -77,7 +78,7 @@ public class BatteryDiffDataTest {
hiddenHistEntry); hiddenHistEntry);
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
hiddenDiffEntry, List.of(), mApplicationsState); hiddenDiffEntry, List.of(), Set.of());
assertThat(needsCombineInSystemApp).isTrue(); assertThat(needsCombineInSystemApp).isTrue();
} }
@@ -107,7 +108,7 @@ public class BatteryDiffDataTest {
mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM; mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
batteryDiffEntry, List.of(), mApplicationsState); batteryDiffEntry, List.of(), Set.of(ConvertUtils.FAKE_PACKAGE_NAME));
assertThat(needsCombineInSystemApp).isTrue(); assertThat(needsCombineInSystemApp).isTrue();
} }
@@ -137,7 +138,7 @@ public class BatteryDiffDataTest {
mApplicationInfo.flags = 0; mApplicationInfo.flags = 0;
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
batteryDiffEntry, List.of(), mApplicationsState); batteryDiffEntry, List.of(), Set.of());
assertThat(needsCombineInSystemApp).isFalse(); assertThat(needsCombineInSystemApp).isFalse();
} }

View File

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

View File

@@ -90,6 +90,7 @@ public final class DataProcessorTest {
mFeatureFactory = FakeFeatureFactory.setupForTest(); mFeatureFactory = FakeFeatureFactory.setupForTest();
mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider; mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
DataProcessor.sFakeSystemAppsSet = Set.of();
DataProcessor.sUsageStatsManager = mUsageStatsManager; DataProcessor.sUsageStatsManager = mUsageStatsManager;
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());