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:
@@ -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 />
|
||||
|
||||
|
@@ -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 {
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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",
|
||||
|
@@ -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) {
|
||||
|
@@ -38,7 +38,6 @@ import com.android.settingslib.widget.AppPreference;
|
||||
*/
|
||||
public class PowerGaugePreference extends AppPreference {
|
||||
|
||||
private static final double PERCENTAGE_TO_SHOW_THRESHOLD = 1f;
|
||||
// Please see go/battery-usage-app-list-alpha
|
||||
private static final float SELECTABLE_ALPHA = 1f;
|
||||
private static final float UNSELECTABLE_ALPHA_LIGHT_MODE = 0.65f;
|
||||
@@ -81,29 +80,17 @@ public class PowerGaugePreference extends AppPreference {
|
||||
notifyChanged();
|
||||
}
|
||||
|
||||
/** Sets the percent of total. */
|
||||
public void setPercent(double percentOfTotal) {
|
||||
mProgress = percentOfTotal < PERCENTAGE_TO_SHOW_THRESHOLD
|
||||
? "-" : Utils.formatPercentage(percentOfTotal, true);
|
||||
/** Sets the percentage to show. */
|
||||
public void setPercentage(CharSequence percentage) {
|
||||
mProgress = percentage;
|
||||
notifyChanged();
|
||||
}
|
||||
|
||||
/** Gets the percent of total. */
|
||||
public String getPercent() {
|
||||
/** Gets the percentage to show. */
|
||||
public String getPercentage() {
|
||||
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 */
|
||||
public void shouldShowAnomalyIcon(boolean showAnomalyIcon) {
|
||||
mShowAnomalyIcon = showAnomalyIcon;
|
||||
|
@@ -108,7 +108,7 @@ private class AppBatteryPresenter(private val context: Context, private val app:
|
||||
private fun BatteryDiffEntry?.getSummary(): String =
|
||||
this?.takeIf { mConsumePower > 0 }?.let {
|
||||
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)
|
||||
|
||||
@@ -127,7 +127,7 @@ private class AppBatteryPresenter(private val context: Context, private val app:
|
||||
context,
|
||||
AppInfoSettingsProvider.METRICS_CATEGORY,
|
||||
this,
|
||||
Utils.formatPercentage(percentOfTotal, true),
|
||||
Utils.formatPercentage(percentage, true),
|
||||
null,
|
||||
false,
|
||||
)
|
||||
|
@@ -145,7 +145,7 @@ public class AppBatteryPreferenceControllerTest {
|
||||
mController.displayPreference(mScreen);
|
||||
mBatteryDiffEntry.mConsumePower = 1;
|
||||
mController.mBatteryDiffEntry = mBatteryDiffEntry;
|
||||
when(mBatteryDiffEntry.getPercentOfTotal()).thenReturn(60.0);
|
||||
when(mBatteryDiffEntry.getPercentage()).thenReturn(60.0);
|
||||
|
||||
mController.updateBatteryWithDiffEntry();
|
||||
|
||||
|
@@ -37,6 +37,7 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -58,26 +59,10 @@ public class BatteryDiffDataTest {
|
||||
|
||||
@Test
|
||||
public void needsCombineInSystemApp_isHidden_returnTrue() {
|
||||
final int currentUserId = mContext.getUserId();
|
||||
final BatteryHistEntry hiddenHistEntry = createBatteryHistEntry(
|
||||
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);
|
||||
final BatteryDiffEntry hiddenDiffEntry =
|
||||
createBatteryDiffEntry(mContext, /*consumePower=*/ 0, /*isHidden=*/ true);
|
||||
|
||||
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
|
||||
final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
|
||||
hiddenDiffEntry, List.of(), Set.of());
|
||||
|
||||
assertThat(needsCombineInSystemApp).isTrue();
|
||||
@@ -85,29 +70,13 @@ public class BatteryDiffDataTest {
|
||||
|
||||
@Test
|
||||
public void needsCombineInSystemApp_isSystemApp_returnTrue() {
|
||||
final int currentUserId = mContext.getUserId();
|
||||
final BatteryHistEntry batteryHistEntry = createBatteryHistEntry(
|
||||
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);
|
||||
final BatteryDiffEntry batteryDiffEntry =
|
||||
createBatteryDiffEntry(mContext, /*consumePower=*/ 0, /*isHidden=*/ false);
|
||||
doReturn(mAppEntry).when(mApplicationsState).getEntry(anyString(), anyInt());
|
||||
mAppEntry.info = mApplicationInfo;
|
||||
mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM;
|
||||
|
||||
boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
|
||||
final boolean needsCombineInSystemApp = BatteryDiffData.needsCombineInSystemApp(
|
||||
batteryDiffEntry, List.of(), Set.of(ConvertUtils.FAKE_PACKAGE_NAME));
|
||||
|
||||
assertThat(needsCombineInSystemApp).isTrue();
|
||||
@@ -115,32 +84,78 @@ public class BatteryDiffDataTest {
|
||||
|
||||
@Test
|
||||
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(
|
||||
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
|
||||
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", consumePower,
|
||||
/*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=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, isHidden);
|
||||
return new BatteryDiffEntry(
|
||||
context,
|
||||
/*foregroundUsageTimeInMs=*/ 0,
|
||||
/*backgroundUsageTimeInMs=*/ 0,
|
||||
/*screenOnTimeInMs=*/ 0,
|
||||
/*consumePower=*/ 0,
|
||||
/*consumePower=*/ consumePower,
|
||||
/*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 0,
|
||||
/*backgroundUsageConsumePower=*/ 0,
|
||||
/*cachedUsageConsumePower=*/ 0,
|
||||
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(
|
||||
|
@@ -106,7 +106,7 @@ public final class BatteryDiffEntryTest {
|
||||
/*batteryHistEntry=*/ null);
|
||||
entry.setTotalConsumePower(100.0);
|
||||
|
||||
assertThat(entry.getPercentOfTotal()).isEqualTo(22.0);
|
||||
assertThat(entry.getPercentage()).isEqualTo(22.0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -125,21 +125,28 @@ public final class BatteryDiffEntryTest {
|
||||
/*batteryHistEntry=*/ null);
|
||||
entry.setTotalConsumePower(0);
|
||||
|
||||
assertThat(entry.getPercentOfTotal()).isEqualTo(0);
|
||||
assertThat(entry.getPercentage()).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testComparator_sortCollectionsInDescOrder() {
|
||||
final List<BatteryDiffEntry> entryList = new ArrayList<>();
|
||||
// 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(20, mBatteryHistEntry));
|
||||
entryList.add(createBatteryDiffEntry(10, mBatteryHistEntry));
|
||||
|
||||
Collections.sort(entryList, BatteryDiffEntry.COMPARATOR);
|
||||
|
||||
assertThat(entryList.get(0).getPercentOfTotal()).isEqualTo(30);
|
||||
assertThat(entryList.get(1).getPercentOfTotal()).isEqualTo(20);
|
||||
assertThat(entryList.get(2).getPercentOfTotal()).isEqualTo(10);
|
||||
assertThat(entryList.get(0).getPercentage()).isEqualTo(30);
|
||||
assertThat(entryList.get(1).getPercentage()).isEqualTo(20);
|
||||
assertThat(entryList.get(2).getPercentage()).isEqualTo(10);
|
||||
assertThat(entryList.get(3).getPercentage()).isEqualTo(16);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -234,6 +234,40 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
/* 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
|
||||
public void setPreferenceSummary_systemEntryTotalUsageTimeIsZero_emptySummary() {
|
||||
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
|
||||
|
@@ -1993,7 +1993,7 @@ public final class DataProcessorTest {
|
||||
assertThat(entry.mBatteryHistEntry.mUserId).isEqualTo(userId);
|
||||
assertThat(entry.mBatteryHistEntry.mUid).isEqualTo(uid);
|
||||
assertThat(entry.mBatteryHistEntry.mConsumerType).isEqualTo(consumerType);
|
||||
assertThat(entry.getPercentOfTotal()).isEqualTo(consumePercentage);
|
||||
assertThat(entry.getPercentage()).isEqualTo(consumePercentage);
|
||||
assertThat(entry.mForegroundUsageConsumePower).isEqualTo(foregroundUsageConsumePower);
|
||||
assertThat(entry.mForegroundServiceUsageConsumePower)
|
||||
.isEqualTo(foregroundServiceUsageConsumePower);
|
||||
|
@@ -65,15 +65,6 @@ public class PowerGaugePreferenceTest {
|
||||
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
|
||||
public void testOnBindViewHolder_showAnomaly_bindAnomalyIcon() {
|
||||
mPowerGaugePreference.shouldShowAnomalyIcon(true);
|
||||
@@ -104,18 +95,4 @@ public class PowerGaugePreferenceTest {
|
||||
assertThat(mPreferenceViewHolder.findViewById(android.R.id.title).getContentDescription())
|
||||
.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("-");
|
||||
}
|
||||
}
|
||||
|
@@ -37,8 +37,6 @@ import com.android.settings.fuelgauge.AdvancedPowerUsageDetail
|
||||
import com.android.settings.fuelgauge.batteryusage.BatteryChartPreferenceController
|
||||
import com.android.settings.fuelgauge.batteryusage.BatteryDiffEntry
|
||||
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 org.junit.After
|
||||
import org.junit.Before
|
||||
@@ -142,7 +140,7 @@ class AppBatteryPreferenceTest {
|
||||
val batteryDiffEntry = mock(BatteryDiffEntry::class.java).apply {
|
||||
mConsumePower = 12.3
|
||||
}
|
||||
whenever(batteryDiffEntry.percentOfTotal).thenReturn(45.6)
|
||||
whenever(batteryDiffEntry.percentage).thenReturn(45.6)
|
||||
mockBatteryDiffEntry(batteryDiffEntry)
|
||||
|
||||
setContent()
|
||||
@@ -153,7 +151,7 @@ class AppBatteryPreferenceTest {
|
||||
@Test
|
||||
fun whenClick_openDetailsPage() {
|
||||
val batteryDiffEntry = mock(BatteryDiffEntry::class.java)
|
||||
whenever(batteryDiffEntry.percentOfTotal).thenReturn(10.0)
|
||||
whenever(batteryDiffEntry.percentage).thenReturn(10.0)
|
||||
mockBatteryDiffEntry(batteryDiffEntry)
|
||||
|
||||
setContent()
|
||||
|
Reference in New Issue
Block a user