diff --git a/res/values/strings.xml b/res/values/strings.xml
index 00a15a0..b2d85da 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -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] -->
diff --git a/src/com/android/settings/biometrics2/ui/model/EnrollmentStatusMessage.java b/src/com/android/settings/biometrics2/ui/model/EnrollmentStatusMessage.java
new file mode 100644
index 0000000..184e1d1
--- /dev/null
+++ b/src/com/android/settings/biometrics2/ui/model/EnrollmentStatusMessage.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics2.ui.model;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * Enrolling status message (help or error)
+ */
+public final class EnrollmentStatusMessage {
+
+    private final int mMsgId;
+    @NonNull private final CharSequence mStr;
+
+    public EnrollmentStatusMessage(int msgId, @Nullable CharSequence str) {
+        mMsgId = msgId;
+        mStr = str != null ? str : "";
+    }
+
+    public int getMsgId() {
+        return mMsgId;
+    }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode())
+                + "{id:" + mMsgId + ", str:" + mStr + "}";
+    }
+
+    /**
+     * Gets status string
+     */
+    @NonNull
+    public CharSequence getStr() {
+        return mStr;
+    }
+}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
index cec9475..0483c6f 100644
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
+++ b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
@@ -38,6 +38,7 @@
 import com.android.settings.biometrics.fingerprint.FingerprintUpdater;
 import com.android.settings.biometrics.fingerprint.MessageDisplayController;
 import com.android.settings.biometrics2.ui.model.EnrollmentProgress;
+import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage;
 
 /**
  * Progress ViewModel handles the state around biometric enrollment. It manages the state of
@@ -51,6 +52,10 @@
 
     private final MutableLiveData<EnrollmentProgress> mProgressLiveData = new MutableLiveData<>(
             new EnrollmentProgress(INITIAL_STEPS, INITIAL_REMAINING));
+    private final MutableLiveData<EnrollmentStatusMessage> mHelpMessageLiveData =
+            new MutableLiveData<>();
+    private final MutableLiveData<EnrollmentStatusMessage> mErrorMessageLiveData =
+            new MutableLiveData<>();
 
     private byte[] mToken = null;
     private int mUserId = UserHandle.myUserId();
@@ -75,12 +80,12 @@
 
         @Override
         public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
-            // TODO add LiveData for help message during implementing b/260957933
+            mHelpMessageLiveData.postValue(new EnrollmentStatusMessage(helpMsgId, helpString));
         }
 
         @Override
         public void onEnrollmentError(int errMsgId, CharSequence errString) {
-            // TODO add LiveData for error message during implementing b/260957933
+            mErrorMessageLiveData.postValue(new EnrollmentStatusMessage(errMsgId, errString));
         }
     };
 
@@ -91,15 +96,16 @@
         final Resources res = application.getResources();
         mMessageDisplayController =
                 res.getBoolean(R.bool.enrollment_message_display_controller_flag)
-                ? new MessageDisplayController(
-                        application.getMainThreadHandler(),
-                        mEnrollmentCallback,
-                        SystemClock.elapsedRealtimeClock(),
-                        res.getInteger(R.integer.enrollment_help_minimum_time_display),
-                        res.getInteger(R.integer.enrollment_progress_minimum_time_display),
-                        res.getBoolean(R.bool.enrollment_progress_priority_over_help),
-                        res.getBoolean(R.bool.enrollment_prioritize_acquire_messages),
-                        res.getInteger(R.integer.enrollment_collect_time)) : null;
+                        ? new MessageDisplayController(
+                                application.getMainThreadHandler(),
+                                mEnrollmentCallback,
+                                SystemClock.elapsedRealtimeClock(),
+                                res.getInteger(R.integer.enrollment_help_minimum_time_display),
+                                res.getInteger(R.integer.enrollment_progress_minimum_time_display),
+                                res.getBoolean(R.bool.enrollment_progress_priority_over_help),
+                                res.getBoolean(R.bool.enrollment_prioritize_acquire_messages),
+                                res.getInteger(R.integer.enrollment_collect_time))
+                        : null;
     }
 
     public void setToken(byte[] token) {
@@ -121,6 +127,14 @@
         return mProgressLiveData;
     }
 
+    public LiveData<EnrollmentStatusMessage> getHelpMessageLiveData() {
+        return mHelpMessageLiveData;
+    }
+
+    public LiveData<EnrollmentStatusMessage> getErrorMessageLiveData() {
+        return mErrorMessageLiveData;
+    }
+
     /**
      * Starts enrollment and return latest isEnrolling() result
      */
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index e091300..e9818fb 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -26,7 +26,6 @@
 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.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 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 @@
     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 @@
         private int mConsumedPower;
         private long mForegroundTimeMs;
         private long mBackgroundTimeMs;
+        private long mScreenOnTimeMs;
         private boolean mIsUserEntry;
     }
 
@@ -156,6 +158,7 @@
         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 @@
         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 @@
             controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info));
         }
 
-        controller.setSummary(getAppActiveTime(bundle));
+        controller.setSummary(getHeaderSummary(bundle));
         controller.done(context, true /* rebindActions */);
     }
 
@@ -474,113 +478,20 @@
         }
     }
 
-    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;
+        final String usageSummary = BatteryUtils.buildBatteryUsageTimeSummary(getContext(),
+                /* isSystem= */ false, foregroundTimeMs, backgroundTimeMs, screenOnTimeInMs);
 
-        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);
+        if (usageSummary.isEmpty()) {
+            return getText(R.string.battery_usage_without_time);
         } else {
-            // Shows summary text with slot time.
-            usageTimeSummary = getAppActiveSummaryWithSlotTime(
-                    foregroundTimeMs, backgroundTimeMs, totalTimeMs, slotTime);
-        }
-        return usageTimeSummary;
-    }
-
-    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.
-        } 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);
         }
     }
 }
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 7b44fd3..98defbd 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -34,6 +34,7 @@
 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.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.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 @@
         }
         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);
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index 69ae478..c151517 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -36,6 +36,11 @@
     boolean isBatteryUsageEnabled();
 
     /**
+     * Returns a threshold (mA) for the minimal comsume power in battery usage list
+     */
+    double getBatteryUsageListConsumePowerThreshold();
+
+    /**
      * Returns an allowlist of app names combined into the system-apps item
      */
     List<String> getSystemAppsAllowlist();
@@ -46,7 +51,7 @@
     boolean isLocationSettingEnabled(String[] packages);
 
     /**
-     * Gets an {@link Intent} to show additional battery info.
+     * Gets an {@link Intent} to show additional battery info
      */
     Intent getAdditionalBatteryInfoIntent();
 
@@ -61,37 +66,37 @@
     boolean isTypeSystem(int uid, String[] packages);
 
     /**
-     * Returns an improved prediction for battery time remaining.
+     * Returns an improved prediction for battery time remaining
      */
     Estimate getEnhancedBatteryPrediction(Context context);
 
     /**
-     * Returns an improved projection curve for future battery level.
+     * Returns an improved projection curve for future battery level
      *
      * @param zeroTime timestamps (array keys) are shifted by this amount
      */
     SparseIntArray getEnhancedBatteryPredictionCurve(Context context, long zeroTime);
 
     /**
-     * Checks whether the toggle for enhanced battery predictions is enabled.
+     * Checks whether the toggle for enhanced battery predictions is enabled
      */
     boolean isEnhancedBatteryPredictionEnabled(Context context);
 
     /**
-     * Checks whether debugging should be enabled for battery estimates.
+     * Checks whether debugging should be enabled for battery estimates
      */
     boolean isEstimateDebugEnabled();
 
     /**
      * Converts the provided string containing the remaining time into a debug string for enhanced
-     * estimates.
+     * estimates
      *
      * @return A string containing the estimate and a label indicating it is an enhanced estimate
      */
     String getEnhancedEstimateDebugString(String timeRemaining);
 
     /**
-     * Converts the provided string containing the remaining time into a debug string.
+     * Converts the provided string containing the remaining time into a debug string
      *
      * @return A string containing the estimate and a label indicating it is a normal estimate
      */
@@ -103,7 +108,7 @@
     boolean isSmartBatterySupported();
 
     /**
-     * Checks whether we should show usage information by slots or not.
+     * Checks whether we should show usage information by slots or not
      */
     boolean isChartGraphSlotsEnabled(Context context);
 
@@ -123,7 +128,7 @@
     boolean isExtraDefend();
 
     /**
-     * Returns {@code true} if delay the hourly job when device is booting.
+     * Returns {@code true} if delay the hourly job when device is booting
      */
     boolean delayHourlyJobWhenBooting();
 
@@ -133,27 +138,27 @@
     Intent getResumeChargeIntent(boolean isDockDefender);
 
     /**
-     * Returns {@link Set} for the system component ids which are combined into others.
+     * Returns {@link Set} for the system component ids which are combined into others
      */
     Set<Integer> getOthersSystemComponentSet();
 
     /**
-     * Returns {@link Set} for hiding system component ids in the usage screen.
+     * Returns {@link Set} for hiding system component ids in the usage screen
      */
     Set<Integer> getHideSystemComponentSet();
 
     /**
-     * Returns {@link Set} for hiding application package names in the usage screen.
+     * Returns {@link Set} for hiding application package names in the usage screen
      */
     Set<String> getHideApplicationSet();
 
     /**
-     * Returns {@link Set} for hiding applications background usage time.
+     * Returns {@link Set} for hiding applications background usage time
      */
     Set<String> getHideBackgroundUsageTimeSet();
 
     /**
-     * Returns {@link Set} for ignoring task root class names for screen on time.
+     * Returns {@link Set} for ignoring task root class names for screen on time
      */
     Set<String> getIgnoreScreenOnTimeTaskRootSet();
 }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 399d478..657e5c6 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -72,6 +72,11 @@
     }
 
     @Override
+    public double getBatteryUsageListConsumePowerThreshold() {
+        return 0.0;
+    }
+
+    @Override
     public List<String> getSystemAppsAllowlist() {
         return null;
     }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java
index a1a92bf..a3c77de 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java
@@ -48,7 +48,7 @@
         if (!isAccumulated) {
             final PowerUsageFeatureProvider featureProvider =
                     FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context);
-            purgeFakeAndHiddenPackages(featureProvider);
+            purgeBatteryDiffData(featureProvider);
             combineBatteryDiffEntry(context, featureProvider);
         }
 
@@ -65,9 +65,9 @@
     }
 
     /** Removes fake usage data and hidden packages. */
-    private void purgeFakeAndHiddenPackages(final PowerUsageFeatureProvider featureProvider) {
-        purgeFakeAndHiddenPackages(featureProvider, mAppEntries);
-        purgeFakeAndHiddenPackages(featureProvider, mSystemEntries);
+    private void purgeBatteryDiffData(final PowerUsageFeatureProvider featureProvider) {
+        purgeBatteryDiffData(featureProvider, mAppEntries);
+        purgeBatteryDiffData(featureProvider, mSystemEntries);
     }
 
     /** Combines into SystemAppsBatteryDiffEntry and OthersBatteryDiffEntry. */
@@ -89,9 +89,11 @@
         Collections.sort(mSystemEntries, BatteryDiffEntry.COMPARATOR);
     }
 
-    private static void purgeFakeAndHiddenPackages(
+    private static void purgeBatteryDiffData(
             final PowerUsageFeatureProvider featureProvider,
             final List<BatteryDiffEntry> entries) {
+        final double consumePowerThreshold =
+                featureProvider.getBatteryUsageListConsumePowerThreshold();
         final Set<Integer> hideSystemComponentSet = featureProvider.getHideSystemComponentSet();
         final Set<String> hideBackgroundUsageTimeSet =
                 featureProvider.getHideBackgroundUsageTimeSet();
@@ -99,9 +101,11 @@
         final Iterator<BatteryDiffEntry> iterator = entries.iterator();
         while (iterator.hasNext()) {
             final BatteryDiffEntry entry = iterator.next();
+            final double comsumePower = entry.mConsumePower;
             final String packageName = entry.getPackageName();
             final Integer componentId = entry.mBatteryHistEntry.mDrainType;
-            if (ConvertUtils.FAKE_PACKAGE_NAME.equals(packageName)
+            if (comsumePower < consumePowerThreshold
+                    || ConvertUtils.FAKE_PACKAGE_NAME.equals(packageName)
                     || hideSystemComponentSet.contains(componentId)
                     || (packageName != null && hideApplicationSet.contains(packageName))) {
                 iterator.remove();
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
index 1bb3d01..b95920e 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
@@ -22,7 +22,6 @@
 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.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 @@
     @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));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index d39ba48..6363a8f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -89,7 +89,6 @@
     private static final String SLOT_TIME = "12 am-2 am";
     private static final int ICON_ID = 123;
     private static final int UID = 1;
-    private static final int POWER_MAH = 150;
     private static final long BACKGROUND_TIME_MS = 100;
     private static final long FOREGROUND_ACTIVITY_TIME_MS = 123;
     private static final long FOREGROUND_SERVICE_TIME_MS = 444;
@@ -270,10 +269,11 @@
     }
 
     @Test
-    public void initHeader_noUsageTime_hasCorrectSummary() {
-        Bundle bundle = new Bundle(2);
+    public void initHeader_noAnyTimeNoConsumedPower_hasEmptySummary() {
+        Bundle bundle = new Bundle();
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
         when(mFragment.getArguments()).thenReturn(bundle);
 
         mFragment.initHeader();
@@ -284,10 +284,11 @@
     }
 
     @Test
-    public void initHeader_noUsageTimeButConsumedPower_hasEmptySummary() {
-        Bundle bundle = new Bundle(3);
+    public void initHeader_noAnyTimeButConsumedPower_hasEmptySummary() {
+        Bundle bundle = new Bundle();
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
         bundle.putInt(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_AMOUNT, /* value */ 10);
         when(mFragment.getArguments()).thenReturn(bundle);
 
@@ -299,12 +300,14 @@
     }
 
     @Test
-    public void initHeader_backgroundTwoMinForegroundZero_hasCorrectSummary() {
+    public void initHeader_ScreenTimeZerobackgroundTwoMin_hasCorrectSummary() {
         final long backgroundTimeTwoMinutes = 120000;
         final long foregroundTimeZero = 0;
-        Bundle bundle = new Bundle(2);
+        final long screenOnTimeZero = 0;
+        Bundle bundle = new Bundle();
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
         when(mFragment.getArguments()).thenReturn(bundle);
 
         mFragment.initHeader();
@@ -312,17 +315,19 @@
         ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
         verify(mEntityHeaderController).setSummary(captor.capture());
         assertThat(captor.getValue().toString())
-                .isEqualTo("2 min background since last full charge");
+                .isEqualTo("Background: 2 min\n(since last full charge)");
     }
 
     @Test
-    public void initHeader_backgroundLessThanAMinForegroundZero_hasCorrectSummary() {
+    public void initHeader_ScreenTimeZerobackgroundLessThanAMin_hasCorrectSummary() {
         final long backgroundTimeLessThanAMinute = 59999;
         final long foregroundTimeZero = 0;
-        Bundle bundle = new Bundle(2);
+        final long screenOnTimeZero = 0;
+        Bundle bundle = new Bundle();
         bundle.putLong(
                 AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
         when(mFragment.getArguments()).thenReturn(bundle);
 
         mFragment.initHeader();
@@ -330,35 +335,18 @@
         ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
         verify(mEntityHeaderController).setSummary(captor.capture());
         assertThat(captor.getValue().toString())
-                .isEqualTo("Background less than a minute since last full charge");
+                .isEqualTo("Background: less than a min\n(since last full charge)");
     }
 
     @Test
-    public void initHeader_totalUsageLessThanAMin_hasCorrectSummary() {
-        final long backgroundTimeLessThanHalfMinute = 20000;
-        final long foregroundTimeLessThanHalfMinute = 20000;
-        Bundle bundle = new Bundle(2);
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanHalfMinute);
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeLessThanHalfMinute);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("Total less than a minute since last full charge");
-    }
-
-    @Test
-    public void initHeader_TotalAMinutesBackgroundLessThanAMin_hasCorrectSummary() {
-        final long backgroundTimeZero = 59999;
-        final long foregroundTimeTwoMinutes = 1;
-        Bundle bundle = new Bundle(2);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeZero);
+    public void initHeader_ScreenTimeAMinuteBackgroundTwoMin_hasCorrectSummary() {
+        final long backgroundTimeTwoMinutes = 120000;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeAMinute = 60000;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
         when(mFragment.getArguments()).thenReturn(bundle);
 
         mFragment.initHeader();
@@ -366,106 +354,149 @@
         ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
         verify(mEntityHeaderController).setSummary(captor.capture());
         assertThat(captor.getValue().toString()).isEqualTo(
-                "1 min total • background less than a minute\nsince last full charge");
+                "Screen time: 1 min\nBackground: 2 min\n(since last full charge)");
     }
 
     @Test
-    public void initHeader_TotalAMinBackgroundZero_hasCorrectSummary() {
-        final long backgroundTimeZero = 0;
-        final long foregroundTimeAMinutes = 60000;
-        Bundle bundle = new Bundle(2);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeZero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeAMinutes);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("1 min total since last full charge");
-    }
-
-    @Test
-    public void initHeader_foregroundTwoMinBackgroundFourMin_hasCorrectSummary() {
-        final long backgroundTimeFourMinute = 240000;
+    public void initHeader_ScreenTimeAMinuteBackgroundLessThanAMin_hasCorrectSummary() {
+        final long backgroundTimeLessThanAMinute = 59999;
         final long foregroundTimeTwoMinutes = 120000;
-        Bundle bundle = new Bundle(2);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeFourMinute);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("6 min total • 4 min background\nsince last full charge");
-    }
-
-    @Test
-    public void initHeader_totalUsageLessThanAMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeLessThanHalfMinute = 20000;
-        final long foregroundTimeLessThanHalfMinute = 20000;
-        Bundle bundle = new Bundle(3);
+        final long screenOnTimeAMinute = 60000;
+        Bundle bundle = new Bundle();
         bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanHalfMinute);
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeLessThanHalfMinute);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("Total less than a minute for 12 am-2 am");
-    }
-
-    @Test
-    public void initHeader_TotalAMinBackgroundLessThanAMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeZero = 59999;
-        final long foregroundTimeTwoMinutes = 1;
-        Bundle bundle = new Bundle(3);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeZero);
+                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
         when(mFragment.getArguments()).thenReturn(bundle);
 
         mFragment.initHeader();
 
         ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
         verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("1 min total • background less than a minute\nfor 12 am-2 am");
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: 1 min\nBackground: less than a min\n(since last full charge)");
     }
 
     @Test
-    public void initHeader_TotalAMinBackgroundZeroWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeZero = 0;
-        final long foregroundTimeAMinutes = 60000;
-        Bundle bundle = new Bundle(3);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeZero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeAMinutes);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("1 min total for 12 am-2 am");
-    }
-
-    @Test
-    public void initHeader_foregroundTwoMinBackgroundFourMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeFourMinute = 240000;
+    public void initHeader_ScreenTimeAMinuteBackgroundZero_hasCorrectSummary() {
+        final long backgroundTimezero = 0;
         final long foregroundTimeTwoMinutes = 120000;
-        Bundle bundle = new Bundle(3);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeFourMinute);
+        final long screenOnTimeAMinute = 60000;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: 1 min\n(since last full charge)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeLessThanAMinBackgroundTwoMin_hasCorrectSummary() {
+        final long backgroundTimeTwoMinutes = 120000;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeLessThanAMinute = 59999;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: less than a min\nBackground: 2 min\n(since last full charge)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeLessThanAMinBackgroundLessThanAMin_hasCorrectSummary() {
+        final long backgroundTimeLessThanAMinute = 59999;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeLessThanAMinute = 59999;
+        Bundle bundle = new Bundle();
+        bundle.putLong(
+                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: less than a min\nBackground: less than a min\n(since last full "
+                        + "charge)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeLessThanAMinBackgroundZero_hasCorrectSummary() {
+        final long backgroundTimezero = 0;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeLessThanAMinute = 59999;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: less than a min\n(since last full charge)");
+    }
+
+    @Test
+    public void initHeader_noAnyTimeNoConsumedPowerWithSlotTime_hasEmptySummary() {
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEmpty();
+    }
+
+    @Test
+    public void initHeader_noAnyTimeButConsumedPowerWithSlotTime_hasEmptySummary() {
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
+        bundle.putInt(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_AMOUNT, /* value */ 10);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEmpty();
+    }
+
+    @Test
+    public void initHeader_ScreenTimeZerobackgroundTwoMinWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimeTwoMinutes = 120000;
+        final long foregroundTimeZero = 0;
+        final long screenOnTimeZero = 0;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
         bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
         when(mFragment.getArguments()).thenReturn(bundle);
 
@@ -474,14 +505,158 @@
         ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
         verify(mEntityHeaderController).setSummary(captor.capture());
         assertThat(captor.getValue().toString())
-                .isEqualTo("6 min total • 4 min background\nfor 12 am-2 am");
+                .isEqualTo("Background: 2 min\n(12 am-2 am)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeZerobackgroundLessThanAMinWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimeLessThanAMinute = 59999;
+        final long foregroundTimeZero = 0;
+        final long screenOnTimeZero = 0;
+        Bundle bundle = new Bundle();
+        bundle.putLong(
+                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString())
+                .isEqualTo("Background: less than a min\n(12 am-2 am)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeAMinuteBackgroundTwoMinWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimeTwoMinutes = 120000;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeAMinute = 60000;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: 1 min\nBackground: 2 min\n(12 am-2 am)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeAMinuteBackgroundLessThanAMinWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimeLessThanAMinute = 59999;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeAMinute = 60000;
+        Bundle bundle = new Bundle();
+        bundle.putLong(
+                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: 1 min\nBackground: less than a min\n(12 am-2 am)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeAMinuteBackgroundZeroWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimezero = 0;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeAMinute = 60000;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: 1 min\n(12 am-2 am)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeLessThanAMinBackgroundTwoMinWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimeTwoMinutes = 120000;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeLessThanAMinute = 59999;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: less than a min\nBackground: 2 min\n(12 am-2 am)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeLessAMinBackgroundLessAMinWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimeLessThanAMinute = 59999;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeLessThanAMinute = 59999;
+        Bundle bundle = new Bundle();
+        bundle.putLong(
+                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: less than a min\nBackground: less than a min\n(12 am-2 am)");
+    }
+
+    @Test
+    public void initHeader_ScreenTimeLessThanAMinBackgroundZeroWithSlotTime_hasCorrectSummary() {
+        final long backgroundTimezero = 0;
+        final long foregroundTimeTwoMinutes = 120000;
+        final long screenOnTimeLessThanAMinute = 59999;
+        Bundle bundle = new Bundle();
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
+        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
+        when(mFragment.getArguments()).thenReturn(bundle);
+
+        mFragment.initHeader();
+
+        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
+        verify(mEntityHeaderController).setSummary(captor.capture());
+        assertThat(captor.getValue().toString()).isEqualTo(
+                "Screen time: less than a min\n(12 am-2 am)");
     }
 
     @Test
     public void initHeader_systemUidWithChartIsEnabled_notNullSummary() {
-        Bundle bundle = new Bundle(3);
+        Bundle bundle = new Bundle();
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, 240000);
         bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, 120000);
+        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, 120000);
         bundle.putInt(AdvancedPowerUsageDetail.EXTRA_UID, Process.SYSTEM_UID);
         when(mFragment.getArguments()).thenReturn(bundle);
 
@@ -502,6 +677,8 @@
                 .isEqualTo(0);
         assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME))
                 .isEqualTo(0);
+        assertThat(mBundle.getLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME))
+                .isEqualTo(0);
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
                 .isEqualTo(USAGE_PERCENT);
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
index 9f62352..ea325a1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
@@ -68,6 +68,11 @@
     }
 
     @Test
+    public void testGetBatteryUsageListConsumePowerThreshold_return0() {
+        assertThat(mPowerFeatureProvider.getBatteryUsageListConsumePowerThreshold()).isEqualTo(0.0);
+    }
+
+    @Test
     public void testIsTypeSystem_uidRoot_returnTrue() {
         assertThat(mPowerFeatureProvider.isTypeSystem(Process.ROOT_UID, null)).isTrue();
     }
