From 16dfab6b316f53bbf019e072a5f4debfbe29ea20 Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Mon, 16 Jan 2023 16:43:50 +0800 Subject: [PATCH] Fix b/265632782: Battery usage app list changed when entering the app details page and back This only happens on the first time the Settings package is installed. Discussed with Chaohui, the old showSystemApp() logic in Settings->Apps has some issues. This cl updates the logic to the new logic Chaohui provided. Bug: 265632782 Fix: 265632782 Test: manual Change-Id: I65ca150cc685409f69b8950b131feb198662f055 --- .../batteryusage/BatteryDiffData.java | 31 +++++------------ .../fuelgauge/batteryusage/DataProcessor.java | 33 ++++++++++++++----- .../BatteryChartPreferenceControllerTest.java | 1 + .../batteryusage/BatteryDiffDataTest.java | 7 ++-- .../BatteryUsageBreakdownControllerTest.java | 5 +-- .../batteryusage/DataProcessorTest.java | 1 + 6 files changed, 43 insertions(+), 35 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java index a3c77deed1e..774e6d9b9c3 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java @@ -16,7 +16,6 @@ package com.android.settings.fuelgauge.batteryusage; -import android.app.Application; import android.content.Context; import androidx.annotation.NonNull; @@ -24,7 +23,6 @@ import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.overlay.FeatureFactory; -import com.android.settingslib.applications.ApplicationsState; import java.util.Collections; import java.util.Iterator; @@ -41,6 +39,7 @@ public class BatteryDiffData { final Context context, final @NonNull List appDiffEntries, final @NonNull List systemDiffEntries, + final Set systemAppsSet, final boolean isAccumulated) { mAppEntries = appDiffEntries; mSystemEntries = systemDiffEntries; @@ -49,7 +48,7 @@ public class BatteryDiffData { final PowerUsageFeatureProvider featureProvider = FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); purgeBatteryDiffData(featureProvider); - combineBatteryDiffEntry(context, featureProvider); + combineBatteryDiffEntry(context, featureProvider, systemAppsSet); } setTotalConsumePower(); @@ -71,9 +70,9 @@ public class BatteryDiffData { } /** Combines into SystemAppsBatteryDiffEntry and OthersBatteryDiffEntry. */ - private void combineBatteryDiffEntry( - final Context context, final PowerUsageFeatureProvider featureProvider) { - combineIntoSystemApps(context, featureProvider, mAppEntries); + private void combineBatteryDiffEntry(final Context context, + final PowerUsageFeatureProvider featureProvider, final Set systemAppsSet) { + combineIntoSystemApps(context, featureProvider, systemAppsSet, mAppEntries); combineSystemItemsIntoOthers(context, featureProvider, mSystemEntries); } @@ -119,17 +118,14 @@ public class BatteryDiffData { private static void combineIntoSystemApps( final Context context, final PowerUsageFeatureProvider featureProvider, + final Set systemAppsSet, final List appEntries) { final List systemAppsAllowlist = featureProvider.getSystemAppsAllowlist(); - final Application application = (Application) context.getApplicationContext(); - final ApplicationsState applicationsState = - application == null ? null : ApplicationsState.getInstance(application); - BatteryDiffEntry.SystemAppsBatteryDiffEntry systemAppsDiffEntry = null; final Iterator appListIterator = appEntries.iterator(); while (appListIterator.hasNext()) { final BatteryDiffEntry batteryDiffEntry = appListIterator.next(); - if (needsCombineInSystemApp(batteryDiffEntry, systemAppsAllowlist, applicationsState)) { + if (needsCombineInSystemApp(batteryDiffEntry, systemAppsAllowlist, systemAppsSet)) { if (systemAppsDiffEntry == null) { systemAppsDiffEntry = new BatteryDiffEntry.SystemAppsBatteryDiffEntry(context); } @@ -184,7 +180,7 @@ public class BatteryDiffData { @VisibleForTesting static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry, - final List systemAppsAllowlist, final ApplicationsState applicationsState) { + final List systemAppsAllowlist, final Set systemAppsSet) { if (batteryDiffEntry.mBatteryHistEntry.mIsHidden) { return true; } @@ -198,15 +194,6 @@ public class BatteryDiffData { 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); + return systemAppsSet != null && systemAppsSet.contains(packageName); } } diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java index b61b755404a..864f2e7d963 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java @@ -53,6 +53,8 @@ import com.android.settings.Utils; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.overlay.FeatureFactory; 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.util.ArrayList; @@ -94,11 +96,14 @@ public final class DataProcessor { @VisibleForTesting static final int SELECTED_INDEX_ALL = BatteryChartViewModel.SELECTED_INDEX_ALL; + @VisibleForTesting + static boolean sDebug = false; + @VisibleForTesting static long sFakeCurrentTimeMillis = 0; @VisibleForTesting - static boolean sDebug = false; + static Set sFakeSystemAppsSet; @VisibleForTesting static IUsageStatsManager sUsageStatsManager = @@ -633,10 +638,10 @@ public final class DataProcessor { return null; } final Map> resultMap = new HashMap<>(); + final Set systemAppsSet = getSystemAppsSet(context); // Insert diff data from [0][0] to [maxDailyIndex][maxHourlyIndex]. - insertHourlyUsageDiffData( - context, hourlyBatteryLevelsPerDay, batteryHistoryMap, appUsagePeriodMap, - resultMap); + insertHourlyUsageDiffData(context, systemAppsSet, 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]. @@ -695,7 +700,9 @@ public final class DataProcessor { return null; } - return new BatteryDiffData(context, appEntries, systemEntries, /* isAccumulated= */ false); + final Set systemAppsSet = getSystemAppsSet(context); + return new BatteryDiffData( + context, appEntries, systemEntries, systemAppsSet, /* isAccumulated= */ false); } /** @@ -1363,6 +1370,7 @@ public final class DataProcessor { private static void insertHourlyUsageDiffData( Context context, + final Set systemAppsSet, final List hourlyBatteryLevelsPerDay, final Map> batteryHistoryMap, final Map>>>> @@ -1392,6 +1400,7 @@ public final class DataProcessor { workProfileUserId, hourlyIndex, timestamps, + systemAppsSet, appUsagePeriodMap == null || appUsagePeriodMap.get(dailyIndex) == null ? null @@ -1436,6 +1445,7 @@ public final class DataProcessor { final int workProfileUserId, final int currentIndex, final List timestamps, + final Set systemAppsSet, final Map>> appUsageMap, final Map> batteryHistoryMap) { final List appEntries = new ArrayList<>(); @@ -1589,7 +1599,8 @@ public final class DataProcessor { 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 appUsagePeriodList) { @@ -1672,8 +1683,8 @@ public final class DataProcessor { } } - return diffEntryList.isEmpty() ? null : new BatteryDiffData( - context, appEntries, systemEntries, /* isAccumulated= */ true); + return diffEntryList.isEmpty() ? null : new BatteryDiffData(context, appEntries, + systemEntries, /* systemAppsSet= */ null, /* isAccumulated= */ true); } private static void computeUsageDiffDataPerEntry( @@ -1889,6 +1900,12 @@ public final class DataProcessor { return null; } + private static Set getSystemAppsSet(Context context) { + return sFakeSystemAppsSet != null ? sFakeSystemAppsSet + : AppListRepositoryUtil.getSystemPackageNames(context, + new AppListConfig(context.getUserId(), false)); + } + private static long getCurrentTimeMillis() { return sFakeCurrentTimeMillis > 0 ? sFakeCurrentTimeMillis : System.currentTimeMillis(); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java index 1c653290924..9c922bbe6c0 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java @@ -88,6 +88,7 @@ public final class BatteryChartPreferenceControllerTest { Locale.setDefault(new Locale("en_US")); org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false); TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + DataProcessor.sFakeSystemAppsSet = Set.of(); mFeatureFactory = FakeFeatureFactory.setupForTest(); mContext = spy(RuntimeEnvironment.application); doReturn(mContext).when(mContext).getApplicationContext(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java index 20c9bc52e42..48a6e72a2a1 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffDataTest.java @@ -38,6 +38,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.util.List; +import java.util.Set; @RunWith(RobolectricTestRunner.class) public class BatteryDiffDataTest { @@ -77,7 +78,7 @@ public class BatteryDiffDataTest { hiddenHistEntry); boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( - hiddenDiffEntry, List.of(), mApplicationsState); + hiddenDiffEntry, List.of(), Set.of()); assertThat(needsCombineInSystemApp).isTrue(); } @@ -107,7 +108,7 @@ public class BatteryDiffDataTest { mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM; boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( - batteryDiffEntry, List.of(), mApplicationsState); + batteryDiffEntry, List.of(), Set.of(ConvertUtils.FAKE_PACKAGE_NAME)); assertThat(needsCombineInSystemApp).isTrue(); } @@ -137,7 +138,7 @@ public class BatteryDiffDataTest { mApplicationInfo.flags = 0; boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( - batteryDiffEntry, List.of(), mApplicationsState); + batteryDiffEntry, List.of(), Set.of()); assertThat(needsCombineInSystemApp).isFalse(); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java index 9f067148ebb..840ab3431cf 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java @@ -105,8 +105,9 @@ public final class BatteryUsageBreakdownControllerTest { /*cachedUsageConsumePower=*/ 0, mBatteryHistEntry); mBatteryDiffEntry = spy(mBatteryDiffEntry); - mBatteryUsageBreakdownController.mBatteryDiffData = new BatteryDiffData(mContext, - Arrays.asList(mBatteryDiffEntry), Arrays.asList(), /* isAccumulated= */ false); + mBatteryUsageBreakdownController.mBatteryDiffData = + new BatteryDiffData(mContext, Arrays.asList(mBatteryDiffEntry), Arrays.asList(), + Set.of(), /* isAccumulated= */ false); // Adds fake testing data. BatteryDiffEntry.sResourceCache.put( "fakeBatteryDiffEntryKey", diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java index 576184de6d6..764b3a8486a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java @@ -90,6 +90,7 @@ public final class DataProcessorTest { mFeatureFactory = FakeFeatureFactory.setupForTest(); mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider; + DataProcessor.sFakeSystemAppsSet = Set.of(); DataProcessor.sUsageStatsManager = mUsageStatsManager; doReturn(mIntent).when(mContext).registerReceiver(any(), any()); doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());