Loading res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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">< <xliff:g id="percentage">%1$s</xliff:g></string> <!-- Process Stats strings --> <skip /> Loading src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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 { Loading src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java +51 −26 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -52,8 +54,8 @@ public class BatteryDiffData { combineBatteryDiffEntry(context, featureProvider, systemAppsSet); } setTotalConsumePower(); sortEntries(); processAndSortEntries(mAppEntries); processAndSortEntries(mSystemEntries); } public List<BatteryDiffEntry> getAppDiffEntryList() { Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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); } } src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java +19 −7 Original line number Diff line number Diff line Loading @@ -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()); Loading @@ -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; Loading Loading @@ -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. */ Loading @@ -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. */ Loading Loading @@ -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", Loading src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +20 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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; } Loading @@ -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( Loading Loading @@ -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); Loading @@ -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 Loading
res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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">< <xliff:g id="percentage">%1$s</xliff:g></string> <!-- Process Stats strings --> <skip /> Loading
src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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 { Loading
src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java +51 −26 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -52,8 +54,8 @@ public class BatteryDiffData { combineBatteryDiffEntry(context, featureProvider, systemAppsSet); } setTotalConsumePower(); sortEntries(); processAndSortEntries(mAppEntries); processAndSortEntries(mSystemEntries); } public List<BatteryDiffEntry> getAppDiffEntryList() { Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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); } }
src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java +19 −7 Original line number Diff line number Diff line Loading @@ -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()); Loading @@ -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; Loading Loading @@ -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. */ Loading @@ -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. */ Loading Loading @@ -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", Loading
src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +20 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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; } Loading @@ -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( Loading Loading @@ -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); Loading @@ -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