Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16dfab6b authored by Zaiyue Xue's avatar Zaiyue Xue
Browse files

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
parent b427e8f0
Loading
Loading
Loading
Loading
+9 −22
Original line number Diff line number Diff line
@@ -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<BatteryDiffEntry> appDiffEntries,
            final @NonNull List<BatteryDiffEntry> systemDiffEntries,
            final Set<String> 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<String> 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<String> systemAppsSet,
            final List<BatteryDiffEntry> appEntries) {
        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;
        final Iterator<BatteryDiffEntry> 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<String> systemAppsAllowlist, final ApplicationsState applicationsState) {
            final List<String> systemAppsAllowlist, final Set<String> 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);
    }
}
+25 −8
Original line number Diff line number Diff line
@@ -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<String> sFakeSystemAppsSet;

    @VisibleForTesting
    static IUsageStatsManager sUsageStatsManager =
@@ -633,10 +638,10 @@ public final class DataProcessor {
            return null;
        }
        final Map<Integer, Map<Integer, BatteryDiffData>> resultMap = new HashMap<>();
        final Set<String> 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<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(
            Context context,
            final Set<String> systemAppsSet,
            final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay,
            final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap,
            final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
@@ -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<Long> timestamps,
            final Set<String> systemAppsSet,
            final Map<Long, Map<String, List<AppUsagePeriod>>> appUsageMap,
            final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap) {
        final List<BatteryDiffEntry> 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<AppUsagePeriod> 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<String> 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();
    }
+1 −0
Original line number Diff line number Diff line
@@ -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();
+4 −3
Original line number Diff line number Diff line
@@ -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();
    }
+3 −2
Original line number Diff line number Diff line
@@ -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",
Loading