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

Commit 9e988699 authored by Zaiyue Xue's avatar Zaiyue Xue Committed by Android (Google) Code Review
Browse files

Merge "[Battery usage U] [UI] Show screen time in the battery detail usage page"

parents d481b398 0639abfc
Loading
Loading
Loading
Loading
+2 −30
Original line number Diff line number Diff line
@@ -5031,42 +5031,14 @@
    <!-- Title for battery usage amount by this app. [CHAR LIMIT=80] -->
    <string name="battery_detail_power_usage">Battery usage</string>
    <!-- Description for battery total and background usage time for an app, i.e. 1 hr 15 min total • 39 min background since last full charge. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_total_and_bg_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • <xliff:g id="time" example="39 min">^2</xliff:g> background\nsince last full charge</string>
    <!-- Description for battery total and background usage time in a time period for an app, i.e. 1 hr 15 min total • 39 min background for 12 am-2 am. Note: ^1, ^2 and ^3 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_total_and_bg_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • <xliff:g id="time" example="39 min">^2</xliff:g> background\nfor <xliff:g id="time_period" example="12 am-2 am">^3</xliff:g></string>
    <!-- Description for battery total usage time is less than a minute for an app since last full charge [CHAR LIMIT=120] -->
    <string name="battery_total_usage_less_minute">Total less than a minute since last full charge</string>
    <!-- Description for battery total usage time is less than a minute in a time period for an app, i.e. Total less than a minute for 12 am-2 am. Note: ^1 should be used in all translations[CHAR LIMIT=120] -->
    <string name="battery_total_usage_less_minute_with_period">Total less than a minute for <xliff:g id="time_period" example="12 am-2 am">^1</xliff:g></string>
    <!-- Description for battery background usage time is less than a minute for an app since last full charge [CHAR LIMIT=120] -->
    <string name="battery_bg_usage_less_minute">Background less than a minute since last full charge</string>
    <!-- Description for battery background usage time is less than a minute in a time period for an app, i.e. Background less than a minute for 12 am-2 am. Note: ^1 should be used in all translations[CHAR LIMIT=120] -->
    <string name="battery_bg_usage_less_minute_with_period">Background less than a minute for <xliff:g id="time_period" example="12 am-2 am">^1</xliff:g></string>
    <!-- Description for battery total usage time for an app, i.e. 1 hr 15 min total since last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_total_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total since last full charge</string>
    <!-- Description for battery total usage time in a time period for an app, i.e. 1 hr 15 min total for 12 am-2 am. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_total_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total for <xliff:g id="time_period" example="12 am-2 am">^2</xliff:g></string>
    <!-- Description for battery background usage time for an app, i.e. 1 hr 15 min background since last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_bg_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> background since last full charge</string>
    <!-- Description for battery background usage time in a time period for an app, i.e. 1 hr 15 min background for 12 am-2 am. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_bg_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> background for <xliff:g id="time_period" example="12 am-2 am">^2</xliff:g></string>
    <!-- Description for battery total usage with background usage time less than a minute for an app, i.e. 1 hr 15 min total • background less than a minute since last full charge. Note: ^1 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_total_usage_and_bg_less_minute_usage"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • background less than a minute\nsince last full charge</string>
    <!-- Description for battery total usage with background usage time less than a minute in a time period for an app, i.e. 1 hr 15 min total • background less than a minute for 12 am-2 am. Note: ^1 and ^2 should be used in all translations [CHAR LIMIT=120] -->
    <string name="battery_total_usage_and_bg_less_minute_usage_with_period"><xliff:g id="time" example="1 hr 15 min">^1</xliff:g> total • background less than a minute\nfor <xliff:g id="time_period" example="12 am-2 am">^2</xliff:g></string>
    <!-- Description for no any battery usage since last full charge [CHAR LIMIT=120] -->
    <string name="battery_not_usage">No usage since last full charge</string>
    <!-- Description for no any battery usage for past 24 hr [CHAR LIMIT=120] -->
    <string name="battery_not_usage_24hr">No usage for past 24 hr</string>
    <!-- Description for no usage time but have battery usage [CHAR LIMIT=120] -->
    <string name="battery_usage_without_time"></string>
    <!-- Description for the specific time slot in the battery usage page [CHAR LIMIT=120] -->
    <string name="battery_usage_since_last_full_charge">since last full charge</string>
   <!-- Description for system apps aggregated battery usage data [CHAR LIMIT=120] -->
    <string name="battery_usage_system_apps">System apps</string>
    <!-- Description for others battery usage data [CHAR LIMIT=120] -->
+16 −105
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.View;

@@ -51,7 +50,6 @@ import com.android.settingslib.applications.AppUtils;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.Instrumentable;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.LayoutPreference;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
@@ -74,6 +72,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
    public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
    public static final String EXTRA_FOREGROUND_TIME = "extra_foreground_time";
    public static final String EXTRA_BACKGROUND_TIME = "extra_background_time";
    public static final String EXTRA_SCREEN_ON_TIME = "extra_screen_on_time";
    public static final String EXTRA_SLOT_TIME = "extra_slot_time";
    public static final String EXTRA_LABEL = "extra_label";
    public static final String EXTRA_ICON_ID = "extra_icon_id";
@@ -87,6 +86,8 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
    private static final String KEY_FOOTER_PREFERENCE = "app_usage_footer_preference";
    private static final String PACKAGE_NAME_NONE = "none";

    private static final String HEADER_SUMMARY_FORMAT = "%s\n(%s)";

    private static final int REQUEST_UNINSTALL = 0;
    private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1;

@@ -129,6 +130,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
        private int mConsumedPower;
        private long mForegroundTimeMs;
        private long mBackgroundTimeMs;
        private long mScreenOnTimeMs;
        private boolean mIsUserEntry;
    }

@@ -156,6 +158,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
        launchArgs.mConsumedPower = (int) diffEntry.mConsumePower;
        launchArgs.mForegroundTimeMs = diffEntry.mForegroundUsageTimeInMs;
        launchArgs.mBackgroundTimeMs = diffEntry.mBackgroundUsageTimeInMs;
        launchArgs.mScreenOnTimeMs = diffEntry.mScreenOnTimeInMs;
        launchArgs.mIsUserEntry = histEntry.isUserEntry();
        startBatteryDetailPage(context, sourceMetricsCategory, launchArgs);
    }
@@ -191,6 +194,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
        args.putInt(EXTRA_UID, launchArgs.mUid);
        args.putLong(EXTRA_BACKGROUND_TIME, launchArgs.mBackgroundTimeMs);
        args.putLong(EXTRA_FOREGROUND_TIME, launchArgs.mForegroundTimeMs);
        args.putLong(EXTRA_SCREEN_ON_TIME, launchArgs.mScreenOnTimeMs);
        args.putString(EXTRA_SLOT_TIME, launchArgs.mSlotInformation);
        args.putString(EXTRA_POWER_USAGE_PERCENT, launchArgs.mUsagePercent);
        args.putInt(EXTRA_POWER_USAGE_AMOUNT, launchArgs.mConsumedPower);
@@ -323,7 +327,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
            controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info));
        }

        controller.setSummary(getAppActiveTime(bundle));
        controller.setSummary(getHeaderSummary(bundle));
        controller.done(context, true /* rebindActions */);
    }

@@ -474,113 +478,20 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
        }
    }

    private CharSequence getAppActiveTime(Bundle bundle) {
    private CharSequence getHeaderSummary(Bundle bundle) {
        final long foregroundTimeMs = bundle.getLong(EXTRA_FOREGROUND_TIME);
        final long backgroundTimeMs = bundle.getLong(EXTRA_BACKGROUND_TIME);
        final long screenOnTimeInMs = bundle.getLong(EXTRA_SCREEN_ON_TIME);
        final String slotTime = bundle.getString(EXTRA_SLOT_TIME, null);
        final long totalTimeMs = foregroundTimeMs + backgroundTimeMs;
        final CharSequence usageTimeSummary;

        if (totalTimeMs == 0) {
            usageTimeSummary = getText(R.string.battery_usage_without_time);
        } else if (slotTime == null) {
            // Shows summary text with last full charge if slot time is null.
            usageTimeSummary = getAppFullChargeActiveSummary(
                    foregroundTimeMs, backgroundTimeMs, totalTimeMs);
        } else {
            // Shows summary text with slot time.
            usageTimeSummary = getAppActiveSummaryWithSlotTime(
                    foregroundTimeMs, backgroundTimeMs, totalTimeMs, slotTime);
        }
        return usageTimeSummary;
    }
        final String usageSummary = BatteryUtils.buildBatteryUsageTimeSummary(getContext(),
                /* isSystem= */ false, foregroundTimeMs, backgroundTimeMs, screenOnTimeInMs);

    private CharSequence getAppFullChargeActiveSummary(
            long foregroundTimeMs, long backgroundTimeMs, long totalTimeMs) {
        // Shows background summary only if we don't have foreground usage time.
        if (foregroundTimeMs == 0 && backgroundTimeMs != 0) {
            return backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS ?
                    getText(R.string.battery_bg_usage_less_minute) :
                    TextUtils.expandTemplate(getText(R.string.battery_bg_usage),
                            StringUtil.formatElapsedTime(
                                    getContext(),
                                    backgroundTimeMs,
                                    /* withSeconds */ false,
                                    /* collapseTimeUnit */ false));
        // Shows total usage summary only if total usage time is small.
        } else if (totalTimeMs < DateUtils.MINUTE_IN_MILLIS) {
            return getText(R.string.battery_total_usage_less_minute);
        // Shows different total usage summary when background usage time is small.
        } else if (backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS) {
            return TextUtils.expandTemplate(
                    getText(backgroundTimeMs == 0 ?
                            R.string.battery_total_usage :
                            R.string.battery_total_usage_and_bg_less_minute_usage),
                    StringUtil.formatElapsedTime(
                            getContext(),
                            totalTimeMs,
                            /* withSeconds */ false,
                            /* collapseTimeUnit */ false));
        // Shows default summary.
        if (usageSummary.isEmpty()) {
            return getText(R.string.battery_usage_without_time);
        } else {
            return TextUtils.expandTemplate(
                    getText(R.string.battery_total_and_bg_usage),
                    StringUtil.formatElapsedTime(
                            getContext(),
                            totalTimeMs,
                            /* withSeconds */ false,
                            /* collapseTimeUnit */ false),
                    StringUtil.formatElapsedTime(
                            getContext(),
                            backgroundTimeMs,
                            /* withSeconds */ false,
                            /* collapseTimeUnit */ false));
        }
    }

    private CharSequence getAppActiveSummaryWithSlotTime(
            long foregroundTimeMs, long backgroundTimeMs, long totalTimeMs, String slotTime) {
        // Shows background summary only if we don't have foreground usage time.
        if (foregroundTimeMs == 0 && backgroundTimeMs != 0) {
            return backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS ?
                    TextUtils.expandTemplate(
                            getText(R.string.battery_bg_usage_less_minute_with_period),
                            slotTime) :
                    TextUtils.expandTemplate(getText(R.string.battery_bg_usage_with_period),
                            StringUtil.formatElapsedTime(
                                    getContext(),
                                    backgroundTimeMs,
                                    /* withSeconds */ false,
                                    /* collapseTimeUnit */ false), slotTime);
        // Shows total usage summary only if total usage time is small.
        } else if (totalTimeMs < DateUtils.MINUTE_IN_MILLIS) {
            return TextUtils.expandTemplate(
                    getText(R.string.battery_total_usage_less_minute_with_period), slotTime);
        // Shows different total usage summary when background usage time is small.
        } else if (backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS) {
            return TextUtils.expandTemplate(
                    getText(backgroundTimeMs == 0 ?
                            R.string.battery_total_usage_with_period :
                            R.string.battery_total_usage_and_bg_less_minute_usage_with_period),
                    StringUtil.formatElapsedTime(
                            getContext(),
                            totalTimeMs,
                            /* withSeconds */ false,
                            /* collapseTimeUnit */ false), slotTime);
        // Shows default summary.
        } else {
            return TextUtils.expandTemplate(
                    getText(R.string.battery_total_and_bg_usage_with_period),
                    StringUtil.formatElapsedTime(
                            getContext(),
                            totalTimeMs,
                            /* withSeconds */ false,
                            /* collapseTimeUnit */ false),
                    StringUtil.formatElapsedTime(
                            getContext(),
                            backgroundTimeMs,
                            /* withSeconds */ false,
                            /* collapseTimeUnit */ false), slotTime);
            CharSequence slotSummary = slotTime == null
                    ? getText(R.string.battery_usage_since_last_full_charge) : slotTime;
            return String.format("%s\n(%s)", usageSummary, slotSummary);
        }
    }
}
+44 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.format.DateUtils;
import android.util.Base64;
import android.util.Log;

@@ -43,6 +44,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;

import com.android.internal.util.ArrayUtils;
import com.android.settings.R;
import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper;
import com.android.settings.fuelgauge.batterytip.AnomalyInfo;
import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager;
@@ -53,6 +55,7 @@ import com.android.settingslib.fuelgauge.Estimate;
import com.android.settingslib.fuelgauge.EstimateKt;
import com.android.settingslib.fuelgauge.PowerAllowlistBackend;
import com.android.settingslib.utils.PowerUtil;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.utils.ThreadUtils;

import com.google.protobuf.InvalidProtocolBufferException;
@@ -616,4 +619,45 @@ public class BatteryUtils {
        }
        return DockDefenderMode.DISABLED;
    }

    /** Builds the battery usage time summary. */
    public static String buildBatteryUsageTimeSummary(final Context context, final boolean isSystem,
            final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs,
            final long screenOnTimeInMs) {
        StringBuilder summary = new StringBuilder();
        if (isSystem) {
            final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
            if (totalUsageTimeInMs != 0) {
                summary.append(buildBatteryUsageTimeInfo(context, totalUsageTimeInMs,
                        R.string.battery_usage_total_less_than_one_minute,
                        R.string.battery_usage_for_total_time));
            }
        } else {
            if (screenOnTimeInMs != 0) {
                summary.append(buildBatteryUsageTimeInfo(context, screenOnTimeInMs,
                        R.string.battery_usage_screen_time_less_than_one_minute,
                        R.string.battery_usage_screen_time));
            }
            if (screenOnTimeInMs != 0 && backgroundUsageTimeInMs != 0) {
                summary.append('\n');
            }
            if (backgroundUsageTimeInMs != 0) {
                summary.append(buildBatteryUsageTimeInfo(context, backgroundUsageTimeInMs,
                        R.string.battery_usage_background_less_than_one_minute,
                        R.string.battery_usage_for_background_time));
            }
        }
        return summary.toString();
    }

    /** Builds the battery usage time information for one timestamp. */
    private static String buildBatteryUsageTimeInfo(final Context context, long timeInMs,
            final int lessThanOneMinuteResId, final int normalResId) {
        if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
            return context.getString(lessThanOneMinuteResId);
        }
        final CharSequence timeSequence = StringUtil.formatElapsedTime(
                context, (double) timeInMs, /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
        return context.getString(normalResId, timeSequence);
    }
}
+5 −40
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
@@ -38,12 +37,12 @@ import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.InstrumentedPreferenceFragment;
import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnDestroy;
import com.android.settingslib.utils.StringUtil;
import com.android.settingslib.widget.FooterPreference;

import java.util.HashMap;
@@ -296,43 +295,9 @@ 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;

        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 {
            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 timeInMs, int lessThanOneMinuteResId, int normalResId) {
        if (timeInMs < DateUtils.MINUTE_IN_MILLIS) {
            return mPrefContext.getString(lessThanOneMinuteResId);
        }
        final CharSequence timeSequence =
                StringUtil.formatElapsedTime(mPrefContext, (double) timeInMs,
                        /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
        return mPrefContext.getString(normalResId, timeSequence);
        preference.setSummary(
                BatteryUtils.buildBatteryUsageTimeSummary(mPrefContext, entry.isSystemEntry(),
                        entry.mForegroundUsageTimeInMs, entry.mBackgroundUsageTimeInMs,
                        entry.mScreenOnTimeInMs));
    }
}
+246 −69

File changed.

Preview size limit exceeded, changes collapsed.