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

Commit ae0d935d authored by Zaiyue Xue's avatar Zaiyue Xue Committed by Android (Google) Code Review
Browse files

Merge "Fix b/265387286: The total percentage of all apps is not 100%" into udc-dev

parents d1770419 6d939b34
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5350,6 +5350,8 @@
    <string name="battery_usage_spinner_breakdown_by_apps">Breakdown by apps</string>
    <!-- [CHAR_LIMIT=NONE] The spinner item text in the battery usage breakdown. -->
    <string name="battery_usage_spinner_breakdown_by_system">Breakdown by system</string>
    <!-- [CHAR_LIMIT=NONE] Less than some percentage, e.g. < 1% -->
    <string name="battery_usage_less_than_percent">&lt; <xliff:g id="percentage">%1$s</xliff:g></string>
    <!-- Process Stats strings -->
    <skip />
+2 −2
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController
                    mParent.getMetricsCategory(),
                    mBatteryDiffEntry,
                    Utils.formatPercentage(
                            mBatteryDiffEntry.getPercentOfTotal(), /* round */ true),
                            mBatteryDiffEntry.getPercentage(), /* round */ true),
                    /*slotInformation=*/ null, /*showTimeInformation=*/ false);
            return true;
        }
@@ -190,7 +190,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController
    void updateBatteryWithDiffEntry() {
        if (mBatteryDiffEntry != null && mBatteryDiffEntry.mConsumePower > 0) {
            mBatteryPercent = Utils.formatPercentage(
                    mBatteryDiffEntry.getPercentOfTotal(), /* round */ true);
                    mBatteryDiffEntry.getPercentage(), /* round */ true);
            mPreference.setSummary(mContext.getString(
                    R.string.battery_summary, mBatteryPercent));
        } else {
+51 −26
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ import java.util.Set;

/** Wraps the battery usage diff data for each entry used for battery usage app list. */
public class BatteryDiffData {
    static final double SMALL_PERCENTAGE_THRESHOLD = 1f;

    private final List<BatteryDiffEntry> mAppEntries;
    private final List<BatteryDiffEntry> mSystemEntries;

@@ -52,8 +54,8 @@ public class BatteryDiffData {
            combineBatteryDiffEntry(context, featureProvider, systemAppsSet);
        }

        setTotalConsumePower();
        sortEntries();
        processAndSortEntries(mAppEntries);
        processAndSortEntries(mSystemEntries);
    }

    public List<BatteryDiffEntry> getAppDiffEntryList() {
@@ -77,18 +79,6 @@ public class BatteryDiffData {
        combineSystemItemsIntoOthers(context, featureProvider, mSystemEntries);
    }

    /** Sets total consume power for app and system entries separately. */
    private void setTotalConsumePower() {
        setTotalConsumePowerForAllEntries(mAppEntries);
        setTotalConsumePowerForAllEntries(mSystemEntries);
    }

    /** Sorts entries based on consumed percentage. */
    private void sortEntries() {
        Collections.sort(mAppEntries, BatteryDiffEntry.COMPARATOR);
        Collections.sort(mSystemEntries, BatteryDiffEntry.COMPARATOR);
    }

    private static void purgeBatteryDiffData(
            final PowerUsageFeatureProvider featureProvider,
            final List<BatteryDiffEntry> entries) {
@@ -177,18 +167,6 @@ public class BatteryDiffData {
        }
    }

    // Sets total consume power for each entry.
    private static void setTotalConsumePowerForAllEntries(
            final List<BatteryDiffEntry> batteryDiffEntries) {
        double totalConsumePower = 0.0;
        for (BatteryDiffEntry batteryDiffEntry : batteryDiffEntries) {
            totalConsumePower += batteryDiffEntry.mConsumePower;
        }
        for (BatteryDiffEntry batteryDiffEntry : batteryDiffEntries) {
            batteryDiffEntry.setTotalConsumePower(totalConsumePower);
        }
    }

    @VisibleForTesting
    static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry,
            final List<String> systemAppsAllowlist, final Set<String> systemAppsSet) {
@@ -207,4 +185,51 @@ public class BatteryDiffData {

        return systemAppsSet != null && systemAppsSet.contains(packageName);
    }

    /**
     * Sets total consume power, and adjusts the percentages to ensure the total round percentage
     * could be 100%, and then sorts entries based on the sorting key.
     */
    @VisibleForTesting
    static void processAndSortEntries(final List<BatteryDiffEntry> batteryDiffEntries) {
        if (batteryDiffEntries.isEmpty()) {
            return;
        }

        // Sets total consume power.
        double totalConsumePower = 0.0;
        for (BatteryDiffEntry batteryDiffEntry : batteryDiffEntries) {
            totalConsumePower += batteryDiffEntry.mConsumePower;
        }
        for (BatteryDiffEntry batteryDiffEntry : batteryDiffEntries) {
            batteryDiffEntry.setTotalConsumePower(totalConsumePower);
        }

        // Adjusts percentages to show.
        // The lower bound is treating all the small percentages as 0.
        // The upper bound is treating all the small percentages as 1.
        int totalLowerBound = 0;
        int totalUpperBound = 0;
        for (BatteryDiffEntry entry : batteryDiffEntries) {
            if (entry.getPercentage() < SMALL_PERCENTAGE_THRESHOLD) {
                totalUpperBound += 1;
            } else {
                int roundPercentage = Math.round((float) entry.getPercentage());
                totalLowerBound += roundPercentage;
                totalUpperBound += roundPercentage;
            }
        }
        if (totalLowerBound > 100 || totalUpperBound < 100) {
            Collections.sort(batteryDiffEntries, BatteryDiffEntry.COMPARATOR);
            for (int i = 0; i < totalLowerBound - 100 && i < batteryDiffEntries.size(); i++) {
                batteryDiffEntries.get(i).setAdjustPercentageOffset(-1);
            }
            for (int i = 0; i < 100 - totalUpperBound && i < batteryDiffEntries.size(); i++) {
                batteryDiffEntries.get(i).setAdjustPercentageOffset(1);
            }
        }

        // Sorts entries.
        Collections.sort(batteryDiffEntries, BatteryDiffEntry.COMPARATOR);
    }
}
+19 −7
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ public class BatteryDiffEntry {
    @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
    public static final Map<String, Boolean> sValidForRestriction = new HashMap<>();

    /** A comparator for {@link BatteryDiffEntry} based on consumed percentage. */
    /** A comparator for {@link BatteryDiffEntry} based on the sorting key. */
    public static final Comparator<BatteryDiffEntry> COMPARATOR =
            (a, b) -> Double.compare(b.getSortingKey(), a.getSortingKey());

@@ -65,7 +65,8 @@ public class BatteryDiffEntry {
    protected Context mContext;

    private double mTotalConsumePower;
    private double mPercentOfTotal;
    private double mPercentage;
    private int mAdjustPercentageOffset;
    private UserManager mUserManager;
    private String mDefaultPackageName = null;

@@ -107,8 +108,9 @@ public class BatteryDiffEntry {
    /** Sets the total consumed power in a specific time slot. */
    public void setTotalConsumePower(double totalConsumePower) {
        mTotalConsumePower = totalConsumePower;
        mPercentOfTotal = totalConsumePower == 0
        mPercentage = totalConsumePower == 0
                ? 0 : (mConsumePower / mTotalConsumePower) * 100.0;
        mAdjustPercentageOffset = 0;
    }

    /** Gets the total consumed power in a specific time slot. */
@@ -117,13 +119,23 @@ public class BatteryDiffEntry {
    }

    /** Gets the percentage of total consumed power. */
    public double getPercentOfTotal() {
        return mPercentOfTotal;
    public double getPercentage() {
        return mPercentage;
    }

    /** Gets the percentage offset to adjust. */
    public double getAdjustPercentageOffset() {
        return mAdjustPercentageOffset;
    }

    /** Sets the percentage offset to adjust. */
    public void setAdjustPercentageOffset(int offset) {
        mAdjustPercentageOffset = offset;
    }

    /** Gets the key for sorting */
    public double getSortingKey() {
        return getPercentOfTotal();
        return getPercentage() + getAdjustPercentageOffset();
    }

    /** Clones a new instance. */
@@ -369,7 +381,7 @@ public class BatteryDiffEntry {
                .append(String.format("\n\tname=%s restrictable=%b",
                        mAppLabel, mValidForRestriction))
                .append(String.format("\n\tconsume=%.2f%% %f/%f",
                        mPercentOfTotal, mConsumePower, mTotalConsumePower))
                        mPercentage, mConsumePower, mTotalConsumePower))
                .append(String.format("\n\tconsume power= foreground:%f foregroundService:%f",
                        mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
                .append(String.format("\n\tconsume power= background:%f cached:%f",
+20 −3
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import androidx.preference.PreferenceScreen;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
@@ -86,6 +87,8 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
    FooterPreference mFooterPreference;
    @VisibleForTesting
    BatteryDiffData mBatteryDiffData;
    @VisibleForTesting
    String mPercentLessThanThresholdText;

    public BatteryUsageBreakdownController(
            Context context, Lifecycle lifecycle, SettingsActivity activity,
@@ -147,11 +150,11 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
                        : SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
                /* pageId */ SettingsEnums.OPEN_BATTERY_USAGE,
                TextUtils.isEmpty(packageName) ? PACKAGE_NAME_NONE : packageName,
                (int) Math.round(diffEntry.getPercentOfTotal()));
                (int) Math.round(diffEntry.getPercentage()));
        Log.d(TAG, String.format("handleClick() label=%s key=%s package=%s",
                diffEntry.getAppLabel(), histEntry.getKey(), histEntry.mPackageName));
        AdvancedPowerUsageDetail.startBatteryDetailPage(
                mActivity, mFragment, diffEntry, powerPref.getPercent(), mSlotTimestamp);
                mActivity, mFragment, diffEntry, powerPref.getPercentage(), mSlotTimestamp);
        return true;
    }

@@ -163,6 +166,9 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
        mSpinnerPreference = screen.findPreference(SPINNER_PREFERENCE_KEY);
        mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY);
        mFooterPreference = screen.findPreference(FOOTER_PREFERENCE_KEY);
        mPercentLessThanThresholdText = mPrefContext.getString(
                R.string.battery_usage_less_than_percent,
                Utils.formatPercentage(BatteryDiffData.SMALL_PERCENTAGE_THRESHOLD, false));

        mAppListPreferenceGroup.setOrderingAsAdded(false);
        mSpinnerPreference.initializeSpinner(
@@ -279,11 +285,11 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
            pref.setIcon(appIcon);
            pref.setTitle(appLabel);
            pref.setOrder(prefIndex);
            pref.setPercent(entry.getPercentOfTotal());
            pref.setSingleLineTitle(true);
            // Sets the BatteryDiffEntry to preference for launching detailed page.
            pref.setBatteryDiffEntry(entry);
            pref.setSelectable(entry.validForRestriction());
            setPreferencePercentage(pref, entry);
            setPreferenceSummary(pref, entry);
            if (!isAdded) {
                mAppListPreferenceGroup.addPreference(pref);
@@ -307,6 +313,17 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
        mAppListPreferenceGroup.removeAll();
    }

    @VisibleForTesting
    void setPreferencePercentage(
            PowerGaugePreference preference, BatteryDiffEntry entry) {
        preference.setPercentage(
                entry.getPercentage() < BatteryDiffData.SMALL_PERCENTAGE_THRESHOLD
                        ? mPercentLessThanThresholdText
                        : Utils.formatPercentage(
                                entry.getPercentage() + entry.getAdjustPercentageOffset(),
                                /* round= */ true));
    }

    @VisibleForTesting
    void setPreferenceSummary(
            PowerGaugePreference preference, BatteryDiffEntry entry) {
Loading