Fix b/265387286: The total percentage of all apps is not 100%

Bug: 265387286
Fix: 265387286
Test: manual
Change-Id: I654f8211a45c818f9a2d4867ac679e72c9ce6eb1
This commit is contained in:
Zaiyue Xue
2023-02-20 11:19:24 +08:00
parent 802bff9092
commit 6d939b34dc
14 changed files with 218 additions and 144 deletions

View File

@@ -5350,6 +5350,8 @@
<string name="battery_usage_spinner_breakdown_by_apps">Breakdown by apps</string> <string name="battery_usage_spinner_breakdown_by_apps">Breakdown by apps</string>
<!-- [CHAR_LIMIT=NONE] The spinner item text in the battery usage breakdown. --> <!-- [CHAR_LIMIT=NONE] The spinner item text in the battery usage breakdown. -->
<string name="battery_usage_spinner_breakdown_by_system">Breakdown by system</string> <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 --> <!-- Process Stats strings -->
<skip /> <skip />

View File

@@ -124,7 +124,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController
mParent.getMetricsCategory(), mParent.getMetricsCategory(),
mBatteryDiffEntry, mBatteryDiffEntry,
Utils.formatPercentage( Utils.formatPercentage(
mBatteryDiffEntry.getPercentOfTotal(), /* round */ true), mBatteryDiffEntry.getPercentage(), /* round */ true),
/*slotInformation=*/ null, /*showTimeInformation=*/ false); /*slotInformation=*/ null, /*showTimeInformation=*/ false);
return true; return true;
} }
@@ -190,7 +190,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController
void updateBatteryWithDiffEntry() { void updateBatteryWithDiffEntry() {
if (mBatteryDiffEntry != null && mBatteryDiffEntry.mConsumePower > 0) { if (mBatteryDiffEntry != null && mBatteryDiffEntry.mConsumePower > 0) {
mBatteryPercent = Utils.formatPercentage( mBatteryPercent = Utils.formatPercentage(
mBatteryDiffEntry.getPercentOfTotal(), /* round */ true); mBatteryDiffEntry.getPercentage(), /* round */ true);
mPreference.setSummary(mContext.getString( mPreference.setSummary(mContext.getString(
R.string.battery_summary, mBatteryPercent)); R.string.battery_summary, mBatteryPercent));
} else { } else {

View File

@@ -32,6 +32,8 @@ import java.util.Set;
/** Wraps the battery usage diff data for each entry used for battery usage app list. */ /** Wraps the battery usage diff data for each entry used for battery usage app list. */
public class BatteryDiffData { public class BatteryDiffData {
static final double SMALL_PERCENTAGE_THRESHOLD = 1f;
private final List<BatteryDiffEntry> mAppEntries; private final List<BatteryDiffEntry> mAppEntries;
private final List<BatteryDiffEntry> mSystemEntries; private final List<BatteryDiffEntry> mSystemEntries;
@@ -52,8 +54,8 @@ public class BatteryDiffData {
combineBatteryDiffEntry(context, featureProvider, systemAppsSet); combineBatteryDiffEntry(context, featureProvider, systemAppsSet);
} }
setTotalConsumePower(); processAndSortEntries(mAppEntries);
sortEntries(); processAndSortEntries(mSystemEntries);
} }
public List<BatteryDiffEntry> getAppDiffEntryList() { public List<BatteryDiffEntry> getAppDiffEntryList() {
@@ -77,18 +79,6 @@ public class BatteryDiffData {
combineSystemItemsIntoOthers(context, featureProvider, mSystemEntries); 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( private static void purgeBatteryDiffData(
final PowerUsageFeatureProvider featureProvider, final PowerUsageFeatureProvider featureProvider,
final List<BatteryDiffEntry> entries) { 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 @VisibleForTesting
static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry, static boolean needsCombineInSystemApp(final BatteryDiffEntry batteryDiffEntry,
final List<String> systemAppsAllowlist, final Set<String> systemAppsSet) { final List<String> systemAppsAllowlist, final Set<String> systemAppsSet) {
@@ -207,4 +185,51 @@ public class BatteryDiffData {
return systemAppsSet != null && systemAppsSet.contains(packageName); 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);
}
} }

View File

@@ -47,7 +47,7 @@ public class BatteryDiffEntry {
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public static final Map<String, Boolean> sValidForRestriction = new HashMap<>(); 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 = public static final Comparator<BatteryDiffEntry> COMPARATOR =
(a, b) -> Double.compare(b.getSortingKey(), a.getSortingKey()); (a, b) -> Double.compare(b.getSortingKey(), a.getSortingKey());
@@ -65,7 +65,8 @@ public class BatteryDiffEntry {
protected Context mContext; protected Context mContext;
private double mTotalConsumePower; private double mTotalConsumePower;
private double mPercentOfTotal; private double mPercentage;
private int mAdjustPercentageOffset;
private UserManager mUserManager; private UserManager mUserManager;
private String mDefaultPackageName = null; private String mDefaultPackageName = null;
@@ -107,8 +108,9 @@ public class BatteryDiffEntry {
/** Sets the total consumed power in a specific time slot. */ /** Sets the total consumed power in a specific time slot. */
public void setTotalConsumePower(double totalConsumePower) { public void setTotalConsumePower(double totalConsumePower) {
mTotalConsumePower = totalConsumePower; mTotalConsumePower = totalConsumePower;
mPercentOfTotal = totalConsumePower == 0 mPercentage = totalConsumePower == 0
? 0 : (mConsumePower / mTotalConsumePower) * 100.0; ? 0 : (mConsumePower / mTotalConsumePower) * 100.0;
mAdjustPercentageOffset = 0;
} }
/** Gets the total consumed power in a specific time slot. */ /** Gets the total consumed power in a specific time slot. */
@@ -117,13 +119,23 @@ public class BatteryDiffEntry {
} }
/** Gets the percentage of total consumed power. */ /** Gets the percentage of total consumed power. */
public double getPercentOfTotal() { public double getPercentage() {
return mPercentOfTotal; 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 */ /** Gets the key for sorting */
public double getSortingKey() { public double getSortingKey() {
return getPercentOfTotal(); return getPercentage() + getAdjustPercentageOffset();
} }
/** Clones a new instance. */ /** Clones a new instance. */
@@ -369,7 +381,7 @@ public class BatteryDiffEntry {
.append(String.format("\n\tname=%s restrictable=%b", .append(String.format("\n\tname=%s restrictable=%b",
mAppLabel, mValidForRestriction)) mAppLabel, mValidForRestriction))
.append(String.format("\n\tconsume=%.2f%% %f/%f", .append(String.format("\n\tconsume=%.2f%% %f/%f",
mPercentOfTotal, mConsumePower, mTotalConsumePower)) mPercentage, mConsumePower, mTotalConsumePower))
.append(String.format("\n\tconsume power= foreground:%f foregroundService:%f", .append(String.format("\n\tconsume power= foreground:%f foregroundService:%f",
mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower)) mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
.append(String.format("\n\tconsume power= background:%f cached:%f", .append(String.format("\n\tconsume power= background:%f cached:%f",

View File

@@ -35,6 +35,7 @@ import androidx.preference.PreferenceScreen;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail; import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
@@ -86,6 +87,8 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
FooterPreference mFooterPreference; FooterPreference mFooterPreference;
@VisibleForTesting @VisibleForTesting
BatteryDiffData mBatteryDiffData; BatteryDiffData mBatteryDiffData;
@VisibleForTesting
String mPercentLessThanThresholdText;
public BatteryUsageBreakdownController( public BatteryUsageBreakdownController(
Context context, Lifecycle lifecycle, SettingsActivity activity, Context context, Lifecycle lifecycle, SettingsActivity activity,
@@ -147,11 +150,11 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
: SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM, : SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
/* pageId */ SettingsEnums.OPEN_BATTERY_USAGE, /* pageId */ SettingsEnums.OPEN_BATTERY_USAGE,
TextUtils.isEmpty(packageName) ? PACKAGE_NAME_NONE : packageName, 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", Log.d(TAG, String.format("handleClick() label=%s key=%s package=%s",
diffEntry.getAppLabel(), histEntry.getKey(), histEntry.mPackageName)); diffEntry.getAppLabel(), histEntry.getKey(), histEntry.mPackageName));
AdvancedPowerUsageDetail.startBatteryDetailPage( AdvancedPowerUsageDetail.startBatteryDetailPage(
mActivity, mFragment, diffEntry, powerPref.getPercent(), mSlotTimestamp); mActivity, mFragment, diffEntry, powerPref.getPercentage(), mSlotTimestamp);
return true; return true;
} }
@@ -163,6 +166,9 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
mSpinnerPreference = screen.findPreference(SPINNER_PREFERENCE_KEY); mSpinnerPreference = screen.findPreference(SPINNER_PREFERENCE_KEY);
mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY); mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY);
mFooterPreference = screen.findPreference(FOOTER_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); mAppListPreferenceGroup.setOrderingAsAdded(false);
mSpinnerPreference.initializeSpinner( mSpinnerPreference.initializeSpinner(
@@ -279,11 +285,11 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
pref.setIcon(appIcon); pref.setIcon(appIcon);
pref.setTitle(appLabel); pref.setTitle(appLabel);
pref.setOrder(prefIndex); pref.setOrder(prefIndex);
pref.setPercent(entry.getPercentOfTotal());
pref.setSingleLineTitle(true); pref.setSingleLineTitle(true);
// Sets the BatteryDiffEntry to preference for launching detailed page. // Sets the BatteryDiffEntry to preference for launching detailed page.
pref.setBatteryDiffEntry(entry); pref.setBatteryDiffEntry(entry);
pref.setSelectable(entry.validForRestriction()); pref.setSelectable(entry.validForRestriction());
setPreferencePercentage(pref, entry);
setPreferenceSummary(pref, entry); setPreferenceSummary(pref, entry);
if (!isAdded) { if (!isAdded) {
mAppListPreferenceGroup.addPreference(pref); mAppListPreferenceGroup.addPreference(pref);
@@ -307,6 +313,17 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
mAppListPreferenceGroup.removeAll(); 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 @VisibleForTesting
void setPreferenceSummary( void setPreferenceSummary(
PowerGaugePreference preference, BatteryDiffEntry entry) { PowerGaugePreference preference, BatteryDiffEntry entry) {

View File

@@ -38,7 +38,6 @@ import com.android.settingslib.widget.AppPreference;
*/ */
public class PowerGaugePreference extends AppPreference { public class PowerGaugePreference extends AppPreference {
private static final double PERCENTAGE_TO_SHOW_THRESHOLD = 1f;
// Please see go/battery-usage-app-list-alpha // Please see go/battery-usage-app-list-alpha
private static final float SELECTABLE_ALPHA = 1f; private static final float SELECTABLE_ALPHA = 1f;
private static final float UNSELECTABLE_ALPHA_LIGHT_MODE = 0.65f; private static final float UNSELECTABLE_ALPHA_LIGHT_MODE = 0.65f;
@@ -81,29 +80,17 @@ public class PowerGaugePreference extends AppPreference {
notifyChanged(); notifyChanged();
} }
/** Sets the percent of total. */ /** Sets the percentage to show. */
public void setPercent(double percentOfTotal) { public void setPercentage(CharSequence percentage) {
mProgress = percentOfTotal < PERCENTAGE_TO_SHOW_THRESHOLD mProgress = percentage;
? "-" : Utils.formatPercentage(percentOfTotal, true);
notifyChanged(); notifyChanged();
} }
/** Gets the percent of total. */ /** Gets the percentage to show. */
public String getPercent() { public String getPercentage() {
return mProgress.toString(); return mProgress.toString();
} }
/** Sets the subtitle. */
public void setSubtitle(CharSequence subtitle) {
mProgress = subtitle;
notifyChanged();
}
/** Gets the subtitle. */
public CharSequence getSubtitle() {
return mProgress;
}
/** Sets whether to show anomaly icon */ /** Sets whether to show anomaly icon */
public void shouldShowAnomalyIcon(boolean showAnomalyIcon) { public void shouldShowAnomalyIcon(boolean showAnomalyIcon) {
mShowAnomalyIcon = showAnomalyIcon; mShowAnomalyIcon = showAnomalyIcon;

View File

@@ -108,7 +108,7 @@ private class AppBatteryPresenter(private val context: Context, private val app:
private fun BatteryDiffEntry?.getSummary(): String = private fun BatteryDiffEntry?.getSummary(): String =
this?.takeIf { mConsumePower > 0 }?.let { this?.takeIf { mConsumePower > 0 }?.let {
context.getString( context.getString(
R.string.battery_summary, Utils.formatPercentage(percentOfTotal, true) R.string.battery_summary, Utils.formatPercentage(percentage, true)
) )
} ?: context.getString(R.string.no_battery_summary) } ?: context.getString(R.string.no_battery_summary)
@@ -127,7 +127,7 @@ private class AppBatteryPresenter(private val context: Context, private val app:
context, context,
AppInfoSettingsProvider.METRICS_CATEGORY, AppInfoSettingsProvider.METRICS_CATEGORY,
this, this,
Utils.formatPercentage(percentOfTotal, true), Utils.formatPercentage(percentage, true),
null, null,
false, false,
) )

View File

@@ -145,7 +145,7 @@ public class AppBatteryPreferenceControllerTest {
mController.displayPreference(mScreen); mController.displayPreference(mScreen);
mBatteryDiffEntry.mConsumePower = 1; mBatteryDiffEntry.mConsumePower = 1;
mController.mBatteryDiffEntry = mBatteryDiffEntry; mController.mBatteryDiffEntry = mBatteryDiffEntry;
when(mBatteryDiffEntry.getPercentOfTotal()).thenReturn(60.0); when(mBatteryDiffEntry.getPercentage()).thenReturn(60.0);
mController.updateBatteryWithDiffEntry(); mController.updateBatteryWithDiffEntry();

View File

@@ -37,6 +37,7 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -58,26 +59,10 @@ public class BatteryDiffDataTest {
@Test @Test
public void needsCombineInSystemApp_isHidden_returnTrue() { public void needsCombineInSystemApp_isHidden_returnTrue() {
final int currentUserId = mContext.getUserId(); final BatteryDiffEntry hiddenDiffEntry =
final BatteryHistEntry hiddenHistEntry = createBatteryHistEntry( createBatteryDiffEntry(mContext, /*consumePower=*/ 0, /*isHidden=*/ true);
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, true);
final BatteryDiffEntry hiddenDiffEntry = new BatteryDiffEntry(
mContext,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0,
/*screenOnTimeInMs=*/ 0,
/*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0,
hiddenHistEntry);
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
hiddenDiffEntry, List.of(), Set.of()); hiddenDiffEntry, List.of(), Set.of());
assertThat(needsCombineInSystemApp).isTrue(); assertThat(needsCombineInSystemApp).isTrue();
@@ -85,29 +70,13 @@ public class BatteryDiffDataTest {
@Test @Test
public void needsCombineInSystemApp_isSystemApp_returnTrue() { public void needsCombineInSystemApp_isSystemApp_returnTrue() {
final int currentUserId = mContext.getUserId(); final BatteryDiffEntry batteryDiffEntry =
final BatteryHistEntry batteryHistEntry = createBatteryHistEntry( createBatteryDiffEntry(mContext, /*consumePower=*/ 0, /*isHidden=*/ false);
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, false);
final BatteryDiffEntry batteryDiffEntry = new BatteryDiffEntry(
mContext,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0,
/*screenOnTimeInMs=*/ 0,
/*consumePower=*/ 0,
/*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0,
batteryHistEntry);
doReturn(mAppEntry).when(mApplicationsState).getEntry(anyString(), anyInt()); doReturn(mAppEntry).when(mApplicationsState).getEntry(anyString(), anyInt());
mAppEntry.info = mApplicationInfo; mAppEntry.info = mApplicationInfo;
mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM; mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp( final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
batteryDiffEntry, List.of(), Set.of(ConvertUtils.FAKE_PACKAGE_NAME)); batteryDiffEntry, List.of(), Set.of(ConvertUtils.FAKE_PACKAGE_NAME));
assertThat(needsCombineInSystemApp).isTrue(); assertThat(needsCombineInSystemApp).isTrue();
@@ -115,32 +84,78 @@ public class BatteryDiffDataTest {
@Test @Test
public void needsCombineInSystemApp_notSystemApp_returnFalse() { public void needsCombineInSystemApp_notSystemApp_returnFalse() {
final int currentUserId = mContext.getUserId(); final BatteryDiffEntry batteryDiffEntry =
createBatteryDiffEntry(mContext, /*consumePower=*/ 0, /*isHidden=*/ false);
doReturn(mAppEntry).when(mApplicationsState).getEntry(anyString(), anyInt());
mAppEntry.info = mApplicationInfo;
mApplicationInfo.flags = 0;
final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
batteryDiffEntry, List.of(), Set.of());
assertThat(needsCombineInSystemApp).isFalse();
}
@Test
public void processPercentsAndSort_sumLessThan100_adjustTo100() {
List<BatteryDiffEntry> batteryDiffEntries = new ArrayList<>();
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /*consumePower=*/ 33.33, /*isHidden=*/ false));
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /*consumePower=*/ 33.34, /*isHidden=*/ false));
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /*consumePower=*/ 33.33, /*isHidden=*/ false));
BatteryDiffData.processAndSortEntries(batteryDiffEntries);
assertThat(batteryDiffEntries.get(0).getPercentage()).isEqualTo(33.34);
assertThat(batteryDiffEntries.get(0).getAdjustPercentageOffset()).isEqualTo(1);
assertThat(batteryDiffEntries.get(1).getPercentage()).isEqualTo(33.33);
assertThat(batteryDiffEntries.get(1).getAdjustPercentageOffset()).isEqualTo(0);
assertThat(batteryDiffEntries.get(2).getPercentage()).isEqualTo(33.33);
assertThat(batteryDiffEntries.get(2).getAdjustPercentageOffset()).isEqualTo(0);
}
@Test
public void processPercentsAndSort_sumGreaterThan100_adjustTo100() {
List<BatteryDiffEntry> batteryDiffEntries = new ArrayList<>();
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /*consumePower=*/ 48.5, /*isHidden=*/ false));
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /*consumePower=*/ 3, /*isHidden=*/ false));
batteryDiffEntries.add(
createBatteryDiffEntry(mContext, /*consumePower=*/ 48.5, /*isHidden=*/ false));
BatteryDiffData.processAndSortEntries(batteryDiffEntries);
assertThat(batteryDiffEntries.get(0).getPercentage()).isEqualTo(48.5);
assertThat(batteryDiffEntries.get(0).getAdjustPercentageOffset()).isEqualTo(0);
assertThat(batteryDiffEntries.get(1).getPercentage()).isEqualTo(48.5);
assertThat(batteryDiffEntries.get(1).getAdjustPercentageOffset()).isEqualTo(-1);
assertThat(batteryDiffEntries.get(2).getPercentage()).isEqualTo(3);
assertThat(batteryDiffEntries.get(2).getAdjustPercentageOffset()).isEqualTo(0);
}
private static BatteryDiffEntry createBatteryDiffEntry(
Context context, double consumePower, boolean isHidden) {
final int currentUserId = context.getUserId();
final BatteryHistEntry batteryHistEntry = createBatteryHistEntry( final BatteryHistEntry batteryHistEntry = createBatteryHistEntry(
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0, ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", consumePower,
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, false); /*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, isHidden);
final BatteryDiffEntry batteryDiffEntry = new BatteryDiffEntry( return new BatteryDiffEntry(
mContext, context,
/*foregroundUsageTimeInMs=*/ 0, /*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0, /*backgroundUsageTimeInMs=*/ 0,
/*screenOnTimeInMs=*/ 0, /*screenOnTimeInMs=*/ 0,
/*consumePower=*/ 0, /*consumePower=*/ consumePower,
/*foregroundUsageConsumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
/*backgroundUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
batteryHistEntry); batteryHistEntry);
doReturn(mAppEntry).when(mApplicationsState).getEntry(anyString(), anyInt());
mAppEntry.info = mApplicationInfo;
mApplicationInfo.flags = 0;
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
batteryDiffEntry, List.of(), Set.of());
assertThat(needsCombineInSystemApp).isFalse();
} }
private static BatteryHistEntry createBatteryHistEntry( private static BatteryHistEntry createBatteryHistEntry(

View File

@@ -106,7 +106,7 @@ public final class BatteryDiffEntryTest {
/*batteryHistEntry=*/ null); /*batteryHistEntry=*/ null);
entry.setTotalConsumePower(100.0); entry.setTotalConsumePower(100.0);
assertThat(entry.getPercentOfTotal()).isEqualTo(22.0); assertThat(entry.getPercentage()).isEqualTo(22.0);
} }
@Test @Test
@@ -125,21 +125,28 @@ public final class BatteryDiffEntryTest {
/*batteryHistEntry=*/ null); /*batteryHistEntry=*/ null);
entry.setTotalConsumePower(0); entry.setTotalConsumePower(0);
assertThat(entry.getPercentOfTotal()).isEqualTo(0); assertThat(entry.getPercentage()).isEqualTo(0);
} }
@Test @Test
public void testComparator_sortCollectionsInDescOrder() { public void testComparator_sortCollectionsInDescOrder() {
final List<BatteryDiffEntry> entryList = new ArrayList<>(); final List<BatteryDiffEntry> entryList = new ArrayList<>();
// Generates fake testing data. // Generates fake testing data.
BatteryDiffEntry systemAppsBatteryDiffEntry =
new BatteryDiffEntry.SystemAppsBatteryDiffEntry(mContext);
systemAppsBatteryDiffEntry.mConsumePower = 16;
systemAppsBatteryDiffEntry.setTotalConsumePower(100);
entryList.add(systemAppsBatteryDiffEntry);
entryList.add(createBatteryDiffEntry(30, mBatteryHistEntry)); entryList.add(createBatteryDiffEntry(30, mBatteryHistEntry));
entryList.add(createBatteryDiffEntry(20, mBatteryHistEntry)); entryList.add(createBatteryDiffEntry(20, mBatteryHistEntry));
entryList.add(createBatteryDiffEntry(10, mBatteryHistEntry)); entryList.add(createBatteryDiffEntry(10, mBatteryHistEntry));
Collections.sort(entryList, BatteryDiffEntry.COMPARATOR); Collections.sort(entryList, BatteryDiffEntry.COMPARATOR);
assertThat(entryList.get(0).getPercentOfTotal()).isEqualTo(30); assertThat(entryList.get(0).getPercentage()).isEqualTo(30);
assertThat(entryList.get(1).getPercentOfTotal()).isEqualTo(20); assertThat(entryList.get(1).getPercentage()).isEqualTo(20);
assertThat(entryList.get(2).getPercentOfTotal()).isEqualTo(10); assertThat(entryList.get(2).getPercentage()).isEqualTo(10);
assertThat(entryList.get(3).getPercentage()).isEqualTo(16);
} }
@Test @Test

View File

@@ -234,6 +234,40 @@ public final class BatteryUsageBreakdownControllerTest {
/* percentage of total */ 100); /* percentage of total */ 100);
} }
@Test
public void setPreferencePercent_lessThanThreshold_expectedFormat() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
final BatteryDiffEntry batteryDiffEntry = createBatteryDiffEntry(
/*isSystem=*/ true,
/*screenOnTimeInMs=*/ 0,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0);
batteryDiffEntry.mConsumePower = 0.8;
batteryDiffEntry.setTotalConsumePower(100);
mBatteryUsageBreakdownController.mPercentLessThanThresholdText = "< 1%";
mBatteryUsageBreakdownController.setPreferencePercentage(pref, batteryDiffEntry);
assertThat(pref.getPercentage()).isEqualTo("< 1%");
}
@Test
public void setPreferencePercent_greaterThanThreshold_expectedFormat() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
final BatteryDiffEntry batteryDiffEntry = createBatteryDiffEntry(
/*isSystem=*/ true,
/*screenOnTimeInMs=*/ 0,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0);
batteryDiffEntry.mConsumePower = 16;
batteryDiffEntry.setTotalConsumePower(100);
mBatteryUsageBreakdownController.mPercentLessThanThresholdText = "< 1%";
mBatteryUsageBreakdownController.setPreferencePercentage(pref, batteryDiffEntry);
assertThat(pref.getPercentage()).isEqualTo("16%");
}
@Test @Test
public void setPreferenceSummary_systemEntryTotalUsageTimeIsZero_emptySummary() { public void setPreferenceSummary_systemEntryTotalUsageTimeIsZero_emptySummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);

View File

@@ -1993,7 +1993,7 @@ public final class DataProcessorTest {
assertThat(entry.mBatteryHistEntry.mUserId).isEqualTo(userId); assertThat(entry.mBatteryHistEntry.mUserId).isEqualTo(userId);
assertThat(entry.mBatteryHistEntry.mUid).isEqualTo(uid); assertThat(entry.mBatteryHistEntry.mUid).isEqualTo(uid);
assertThat(entry.mBatteryHistEntry.mConsumerType).isEqualTo(consumerType); assertThat(entry.mBatteryHistEntry.mConsumerType).isEqualTo(consumerType);
assertThat(entry.getPercentOfTotal()).isEqualTo(consumePercentage); assertThat(entry.getPercentage()).isEqualTo(consumePercentage);
assertThat(entry.mForegroundUsageConsumePower).isEqualTo(foregroundUsageConsumePower); assertThat(entry.mForegroundUsageConsumePower).isEqualTo(foregroundUsageConsumePower);
assertThat(entry.mForegroundServiceUsageConsumePower) assertThat(entry.mForegroundServiceUsageConsumePower)
.isEqualTo(foregroundServiceUsageConsumePower); .isEqualTo(foregroundServiceUsageConsumePower);

View File

@@ -65,15 +65,6 @@ public class PowerGaugePreferenceTest {
assertThat(mPowerGaugePreference.getLayoutResource()).isEqualTo(R.layout.preference_app); assertThat(mPowerGaugePreference.getLayoutResource()).isEqualTo(R.layout.preference_app);
} }
@Test
public void testOnBindViewHolder_bindSubtitle() {
mPowerGaugePreference.setSubtitle(SUBTITLE);
mPowerGaugePreference.onBindViewHolder(mPreferenceViewHolder);
TextView widgetSummary = (TextView) mPreferenceViewHolder.findViewById(R.id.widget_summary);
assertThat(widgetSummary.getText()).isEqualTo(SUBTITLE);
}
@Test @Test
public void testOnBindViewHolder_showAnomaly_bindAnomalyIcon() { public void testOnBindViewHolder_showAnomaly_bindAnomalyIcon() {
mPowerGaugePreference.shouldShowAnomalyIcon(true); mPowerGaugePreference.shouldShowAnomalyIcon(true);
@@ -104,18 +95,4 @@ public class PowerGaugePreferenceTest {
assertThat(mPreferenceViewHolder.findViewById(android.R.id.title).getContentDescription()) assertThat(mPreferenceViewHolder.findViewById(android.R.id.title).getContentDescription())
.isEqualTo(CONTENT_DESCRIPTION); .isEqualTo(CONTENT_DESCRIPTION);
} }
@Test
public void setPercent_greaterThanThreshold_showNumber() {
mPowerGaugePreference.setPercent(99.5);
assertThat(mPowerGaugePreference.getPercent()).isEqualTo("100%");
}
@Test
public void setPercent_lessThanThreshold_showBar() {
mPowerGaugePreference.setPercent(0.95);
assertThat(mPowerGaugePreference.getPercent()).isEqualTo("-");
}
} }

View File

@@ -37,8 +37,6 @@ import com.android.settings.fuelgauge.AdvancedPowerUsageDetail
import com.android.settings.fuelgauge.batteryusage.BatteryChartPreferenceController import com.android.settings.fuelgauge.batteryusage.BatteryChartPreferenceController
import com.android.settings.fuelgauge.batteryusage.BatteryDiffEntry import com.android.settings.fuelgauge.batteryusage.BatteryDiffEntry
import com.android.settings.testutils.mockAsUser import com.android.settings.testutils.mockAsUser
import com.android.settingslib.spaprivileged.framework.common.asUser
import com.android.settingslib.spaprivileged.model.app.userHandle
import com.android.settingslib.spaprivileged.model.app.userId import com.android.settingslib.spaprivileged.model.app.userId
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
@@ -142,7 +140,7 @@ class AppBatteryPreferenceTest {
val batteryDiffEntry = mock(BatteryDiffEntry::class.java).apply { val batteryDiffEntry = mock(BatteryDiffEntry::class.java).apply {
mConsumePower = 12.3 mConsumePower = 12.3
} }
whenever(batteryDiffEntry.percentOfTotal).thenReturn(45.6) whenever(batteryDiffEntry.percentage).thenReturn(45.6)
mockBatteryDiffEntry(batteryDiffEntry) mockBatteryDiffEntry(batteryDiffEntry)
setContent() setContent()
@@ -153,7 +151,7 @@ class AppBatteryPreferenceTest {
@Test @Test
fun whenClick_openDetailsPage() { fun whenClick_openDetailsPage() {
val batteryDiffEntry = mock(BatteryDiffEntry::class.java) val batteryDiffEntry = mock(BatteryDiffEntry::class.java)
whenever(batteryDiffEntry.percentOfTotal).thenReturn(10.0) whenever(batteryDiffEntry.percentage).thenReturn(10.0)
mockBatteryDiffEntry(batteryDiffEntry) mockBatteryDiffEntry(batteryDiffEntry)
setContent() setContent()