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

Commit 48a1dacc authored by Zaiyue Xue's avatar Zaiyue Xue
Browse files

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

parent b8926bd8
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -5178,10 +5178,14 @@
    <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 -->
    <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 -->
    <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 -->
    <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 -->
    <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. -->
+26 −27
Original line number Diff line number Diff line
@@ -291,44 +291,43 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
    @VisibleForTesting
    void setPreferenceSummary(
            PowerGaugePreference preference, BatteryDiffEntry entry) {
        final long screenOnTimeInMs = entry.mScreenOnTimeInMs;
        final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
        final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
        final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
        String usageTimeSummary = null;
        // Not shows summary for some system components without usage time.
        if (totalUsageTimeInMs == 0) {
            preference.setSummary(null);
            // Shows background summary only if we don't have foreground usage time.
        } else if (foregroundUsageTimeInMs == 0 && backgroundUsageTimeInMs != 0) {
            usageTimeSummary = buildUsageTimeInfo(backgroundUsageTimeInMs, true);
            // Shows total usage summary only if total usage time is small.
        } else if (totalUsageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
            usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);

        StringBuilder usageTimeSummary = new StringBuilder();
        if (entry.isSystemEntry()) {
            if (totalUsageTimeInMs != 0) {
                usageTimeSummary.append(buildUsageTimeInfo(totalUsageTimeInMs,
                        R.string.battery_usage_total_less_than_one_minute,
                        R.string.battery_usage_for_total_time));
            }
        } else {
            usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
            // Shows background usage time if it is larger than a minute.
            if (backgroundUsageTimeInMs > 0) {
                usageTimeSummary +=
                        "\n" + buildUsageTimeInfo(backgroundUsageTimeInMs, true);
            if (screenOnTimeInMs != 0) {
                usageTimeSummary.append(buildUsageTimeInfo(screenOnTimeInMs,
                        R.string.battery_usage_screen_time_less_than_one_minute,
                        R.string.battery_usage_screen_time));
            }
            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);
    }

    private String buildUsageTimeInfo(long usageTimeInMs, boolean isBackground) {
        if (usageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
            return mPrefContext.getString(
                    isBackground
                            ? R.string.battery_usage_background_less_than_one_minute
                            : R.string.battery_usage_total_less_than_one_minute);
    private String buildUsageTimeInfo(long timeInMs, int lessThanOneMinuteResId, int normalResId) {
        if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
            return mPrefContext.getString(lessThanOneMinuteResId);
        }
        final CharSequence timeSequence =
                StringUtil.formatElapsedTime(mPrefContext, (double) usageTimeInMs,
                StringUtil.formatElapsedTime(mPrefContext, (double) timeInMs,
                        /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
        final int resourceId =
                isBackground
                        ? R.string.battery_usage_for_background_time
                        : R.string.battery_usage_for_total_time;
        return mPrefContext.getString(resourceId, timeSequence);
        return mPrefContext.getString(normalResId, timeSequence);
    }
}
+66 −21
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

import android.app.settings.SettingsEnums;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
@@ -235,73 +236,117 @@ public final class BatteryUsageBreakdownControllerTest {
    }

    @Test
    public void setPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() {
    public void setPreferenceSummary_systemEntryTotalUsageTimeIsZero_emptySummary() {
        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
        pref.setSummary(PREF_SUMMARY);

        mBatteryUsageBreakdownController.setPreferenceSummary(
                pref, createBatteryDiffEntry(
                        /*isSystem=*/ true,
                        /*screenOnTimeInMs=*/ 0,
                        /*foregroundUsageTimeInMs=*/ 0,
                        /*backgroundUsageTimeInMs=*/ 0));
        assertThat(pref.getSummary()).isNull();
        assertThat(pref.getSummary().toString().isEmpty()).isTrue();
    }

    @Test
    public void setPreferenceSummary_setBackgroundUsageTimeOnly() {
    public void setPreferenceSummary_systemEntryTotalUsageTimeLessThanAMinute_expectedSummary() {
        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
        pref.setSummary(PREF_SUMMARY);

        mBatteryUsageBreakdownController.setPreferenceSummary(
                pref, createBatteryDiffEntry(
                        /*foregroundUsageTimeInMs=*/ 0,
                        /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
        assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min");
                        /*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_setTotalUsageTimeLessThanAMinute() {
    public void setPreferenceSummary_systemEntryTotalUsageTimeGreaterThanAMinute_expectedSummary() {
        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
        pref.setSummary(PREF_SUMMARY);

        mBatteryUsageBreakdownController.setPreferenceSummary(
                pref, createBatteryDiffEntry(
                        /*foregroundUsageTimeInMs=*/ 100,
                        /*backgroundUsageTimeInMs=*/ 200));
        assertThat(pref.getSummary().toString()).isEqualTo("Total: less than a min");
                        /*isSystem=*/ true,
                        /*screenOnTimeInMs=*/ 0,
                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS * 2,
                        /*backgroundUsageTimeInMs=*/ 0));
        assertThat(pref.getSummary().toString()).isEqualTo("Total: 2 min");
    }

    @Test
    public void setPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() {
    public void setPreferenceSummary_appEntryAllTimesAreZero_emptySummary() {
        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
        pref.setSummary(PREF_SUMMARY);

        mBatteryUsageBreakdownController.setPreferenceSummary(
                pref, createBatteryDiffEntry(
                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
                        /*backgroundUsageTimeInMs=*/ 200));
        assertThat(pref.getSummary().toString())
                .isEqualTo("Total: 1 min\nBackground: less than a min");
                        /*isSystem=*/ false,
                        /*screenOnTimeInMs=*/ 0,
                        /*foregroundUsageTimeInMs=*/ 0,
                        /*backgroundUsageTimeInMs=*/ 0));
        assertThat(pref.getSummary().toString().isEmpty()).isTrue();
    }

    @Test
    public void setPreferenceSummary_setTotalAndBackgroundUsageTime() {
    public void setPreferenceSummary_appEntryBackgroundUsageTimeOnly_expectedSummary() {
        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
        pref.setSummary(PREF_SUMMARY);

        mBatteryUsageBreakdownController.setPreferenceSummary(
                pref, createBatteryDiffEntry(
                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
                        /*isSystem=*/ false,
                        /*screenOnTimeInMs=*/ 0,
                        /*foregroundUsageTimeInMs=*/ 0,
                        /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
        assertThat(pref.getSummary().toString()).isEqualTo("Total: 2 min\nBackground: 1 min");
        assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min");
    }

    @Test
    public void setPreferenceSummary_appEntryScreenOnTimeOnly_expectedSummary() {
        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
        pref.setSummary(PREF_SUMMARY);

        mBatteryUsageBreakdownController.setPreferenceSummary(
                pref, createBatteryDiffEntry(
                        /*isSystem=*/ false,
                        /*screenOnTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
                        /*foregroundUsageTimeInMs=*/ 0,
                        /*backgroundUsageTimeInMs=*/ 0));
        assertThat(pref.getSummary().toString()).isEqualTo("Screen time: 1 min");
    }

    @Test
    public void setPreferenceSummary_appEntryAllTimesLessThanAMinute_expectedSummary() {
        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
        pref.setSummary(PREF_SUMMARY);

        mBatteryUsageBreakdownController.setPreferenceSummary(
                pref, createBatteryDiffEntry(
                        /*isSystem=*/ false,
                        /*screenOnTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1,
                        /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS - 1));
        assertThat(pref.getSummary().toString()).isEqualTo(
                "Screen time: less than a min\nBackground: less than a min");
    }

    private BatteryDiffEntry createBatteryDiffEntry(
    private BatteryDiffEntry createBatteryDiffEntry(boolean isSystem, long screenOnTimeInMs,
            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(
                mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs, /*screenOnTimeInMs=*/ 0,
                mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs, screenOnTimeInMs,
                /*consumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0,
                /*foregroundServiceUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0,
                /*cachedUsageConsumePower=*/ 0, mBatteryHistEntry);
                /*cachedUsageConsumePower=*/ 0, batteryHistEntry);
    }

    private BatteryUsageBreakdownController createController() {