Merge "[Battery usage U] [UI] Show screen time in the battery usage app list items"

This commit is contained in:
TreeHugger Robot
2023-01-09 11:33:10 +00:00
committed by Android (Google) Code Review
3 changed files with 102 additions and 54 deletions

View File

@@ -5178,10 +5178,14 @@
<string name="battery_usage_total_less_than_one_minute">Total: less than a min</string> <string name="battery_usage_total_less_than_one_minute">Total: less than a min</string>
<!-- [CHAR_LIMIT=NONE] Battery usage item for total background time less than a minute --> <!-- [CHAR_LIMIT=NONE] Battery usage item for total background time less than a minute -->
<string name="battery_usage_background_less_than_one_minute">Background: less than a min</string> <string name="battery_usage_background_less_than_one_minute">Background: less than a min</string>
<!-- [CHAR_LIMIT=NONE] Device screen on time less than a minute -->
<string name="battery_usage_screen_time_less_than_one_minute">Screen time: less than a min</string>
<!-- [CHAR_LIMIT=NONE] Battery usage item for total usage time --> <!-- [CHAR_LIMIT=NONE] Battery usage item for total usage time -->
<string name="battery_usage_for_total_time">Total: <xliff:g id="time">%s</xliff:g></string> <string name="battery_usage_for_total_time">Total: <xliff:g id="time">%s</xliff:g></string>
<!-- [CHAR_LIMIT=NONE] Battery usage item for background usage time --> <!-- [CHAR_LIMIT=NONE] Battery usage item for background usage time -->
<string name="battery_usage_for_background_time">Background: <xliff:g id="time">%s</xliff:g></string> <string name="battery_usage_for_background_time">Background: <xliff:g id="time">%s</xliff:g></string>
<!-- [CHAR_LIMIT=NONE] Device screen on time -->
<string name="battery_usage_screen_time">Screen time: <xliff:g id="time">%s</xliff:g></string>
<!-- [CHAR_LIMIT=NONE] Battery usage main screen footer for empty content --> <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer for empty content -->
<string name="battery_usage_screen_footer_empty">Battery usage data will be available in a few hours once fully charged</string> <string name="battery_usage_screen_footer_empty">Battery usage data will be available in a few hours once fully charged</string>
<!-- [CHAR_LIMIT=NONE] Battery chart label for the current time. --> <!-- [CHAR_LIMIT=NONE] Battery chart label for the current time. -->

View File

@@ -291,44 +291,43 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
@VisibleForTesting @VisibleForTesting
void setPreferenceSummary( void setPreferenceSummary(
PowerGaugePreference preference, BatteryDiffEntry entry) { PowerGaugePreference preference, BatteryDiffEntry entry) {
final long screenOnTimeInMs = entry.mScreenOnTimeInMs;
final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs; final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs; final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs; final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
String usageTimeSummary = null;
// Not shows summary for some system components without usage time. StringBuilder usageTimeSummary = new StringBuilder();
if (totalUsageTimeInMs == 0) { if (entry.isSystemEntry()) {
preference.setSummary(null); if (totalUsageTimeInMs != 0) {
// Shows background summary only if we don't have foreground usage time. usageTimeSummary.append(buildUsageTimeInfo(totalUsageTimeInMs,
} else if (foregroundUsageTimeInMs == 0 && backgroundUsageTimeInMs != 0) { R.string.battery_usage_total_less_than_one_minute,
usageTimeSummary = buildUsageTimeInfo(backgroundUsageTimeInMs, true); R.string.battery_usage_for_total_time));
// Shows total usage summary only if total usage time is small. }
} else if (totalUsageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
} else { } else {
usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false); if (screenOnTimeInMs != 0) {
// Shows background usage time if it is larger than a minute. usageTimeSummary.append(buildUsageTimeInfo(screenOnTimeInMs,
if (backgroundUsageTimeInMs > 0) { R.string.battery_usage_screen_time_less_than_one_minute,
usageTimeSummary += R.string.battery_usage_screen_time));
"\n" + buildUsageTimeInfo(backgroundUsageTimeInMs, true); }
if (screenOnTimeInMs != 0 && backgroundUsageTimeInMs != 0) {
usageTimeSummary.append('\n');
}
if (backgroundUsageTimeInMs != 0) {
usageTimeSummary.append(buildUsageTimeInfo(backgroundUsageTimeInMs,
R.string.battery_usage_background_less_than_one_minute,
R.string.battery_usage_for_background_time));
} }
} }
preference.setSummary(usageTimeSummary); preference.setSummary(usageTimeSummary);
} }
private String buildUsageTimeInfo(long usageTimeInMs, boolean isBackground) { private String buildUsageTimeInfo(long timeInMs, int lessThanOneMinuteResId, int normalResId) {
if (usageTimeInMs < DateUtils.MINUTE_IN_MILLIS) { if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
return mPrefContext.getString( return mPrefContext.getString(lessThanOneMinuteResId);
isBackground
? R.string.battery_usage_background_less_than_one_minute
: R.string.battery_usage_total_less_than_one_minute);
} }
final CharSequence timeSequence = final CharSequence timeSequence =
StringUtil.formatElapsedTime(mPrefContext, (double) usageTimeInMs, StringUtil.formatElapsedTime(mPrefContext, (double) timeInMs,
/*withSeconds=*/ false, /*collapseTimeUnit=*/ false); /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
final int resourceId = return mPrefContext.getString(normalResId, timeSequence);
isBackground
? R.string.battery_usage_for_background_time
: R.string.battery_usage_for_total_time;
return mPrefContext.getString(resourceId, timeSequence);
} }
} }

View File

@@ -25,6 +25,7 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@@ -235,73 +236,117 @@ public final class BatteryUsageBreakdownControllerTest {
} }
@Test @Test
public void setPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() { public void setPreferenceSummary_systemEntryTotalUsageTimeIsZero_emptySummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY); pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary( mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
/*isSystem=*/ true,
/*screenOnTimeInMs=*/ 0,
/*foregroundUsageTimeInMs=*/ 0, /*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0)); /*backgroundUsageTimeInMs=*/ 0));
assertThat(pref.getSummary()).isNull(); assertThat(pref.getSummary().toString().isEmpty()).isTrue();
} }
@Test @Test
public void setPreferenceSummary_setBackgroundUsageTimeOnly() { public void setPreferenceSummary_systemEntryTotalUsageTimeLessThanAMinute_expectedSummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY); pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary( mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
/*isSystem=*/ true,
/*screenOnTimeInMs=*/ 0,
/*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
/*backgroundUsageTimeInMs=*/ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Total: less than a min");
}
@Test
public void setPreferenceSummary_systemEntryTotalUsageTimeGreaterThanAMinute_expectedSummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry(
/*isSystem=*/ true,
/*screenOnTimeInMs=*/ 0,
/*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS * 2,
/*backgroundUsageTimeInMs=*/ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Total: 2 min");
}
@Test
public void setPreferenceSummary_appEntryAllTimesAreZero_emptySummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry(
/*isSystem=*/ false,
/*screenOnTimeInMs=*/ 0,
/*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0));
assertThat(pref.getSummary().toString().isEmpty()).isTrue();
}
@Test
public void setPreferenceSummary_appEntryBackgroundUsageTimeOnly_expectedSummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry(
/*isSystem=*/ false,
/*screenOnTimeInMs=*/ 0,
/*foregroundUsageTimeInMs=*/ 0, /*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS)); /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min"); assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min");
} }
@Test @Test
public void setPreferenceSummary_setTotalUsageTimeLessThanAMinute() { public void setPreferenceSummary_appEntryScreenOnTimeOnly_expectedSummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY); pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary( mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
/*foregroundUsageTimeInMs=*/ 100, /*isSystem=*/ false,
/*backgroundUsageTimeInMs=*/ 200)); /*screenOnTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
assertThat(pref.getSummary().toString()).isEqualTo("Total: less than a min"); /*foregroundUsageTimeInMs=*/ 0,
/*backgroundUsageTimeInMs=*/ 0));
assertThat(pref.getSummary().toString()).isEqualTo("Screen time: 1 min");
} }
@Test @Test
public void setPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() { public void setPreferenceSummary_appEntryAllTimesLessThanAMinute_expectedSummary() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext); final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY); pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary( mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry( pref, createBatteryDiffEntry(
/*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, /*isSystem=*/ false,
/*backgroundUsageTimeInMs=*/ 200)); /*screenOnTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
assertThat(pref.getSummary().toString()) /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
.isEqualTo("Total: 1 min\nBackground: less than a min"); /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1));
assertThat(pref.getSummary().toString()).isEqualTo(
"Screen time: less than a min\nBackground: less than a min");
} }
@Test private BatteryDiffEntry createBatteryDiffEntry(boolean isSystem, long screenOnTimeInMs,
public void setPreferenceSummary_setTotalAndBackgroundUsageTime() {
final PowerGaugePreference pref = new PowerGaugePreference(mContext);
pref.setSummary(PREF_SUMMARY);
mBatteryUsageBreakdownController.setPreferenceSummary(
pref, createBatteryDiffEntry(
/*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
/*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
assertThat(pref.getSummary().toString()).isEqualTo("Total: 2 min\nBackground: 1 min");
}
private BatteryDiffEntry createBatteryDiffEntry(
long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) { long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) {
final ContentValues contentValues = new ContentValues();
contentValues.put(BatteryHistEntry.KEY_CONSUMER_TYPE, Integer.valueOf(
isSystem ? ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY
: ConvertUtils.CONSUMER_TYPE_UID_BATTERY));
contentValues.put(BatteryHistEntry.KEY_USER_ID, Integer.valueOf(1001));
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(contentValues);
return new BatteryDiffEntry( return new BatteryDiffEntry(
mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs, /*screenOnTimeInMs=*/ 0, mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs, screenOnTimeInMs,
/*consumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0, /*consumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0,
/*foregroundServiceUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0,
/*cachedUsageConsumePower=*/ 0, mBatteryHistEntry); /*cachedUsageConsumePower=*/ 0, batteryHistEntry);
} }
private BatteryUsageBreakdownController createController() { private BatteryUsageBreakdownController createController() {