Merge "Fix b/265632782: Battery usage app list changed when entering the app details page and back"
This commit is contained in:
committed by
Android (Google) Code Review
commit
b823e208aa
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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",
|
||||||
|
@@ -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());
|
||||||
|
Reference in New Issue
Block a user