diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 5827498..9131051 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -30,7 +30,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
 import static org.mockito.Mockito.when;
-import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
 
 import android.app.AppOpsManager;
 import android.app.backup.BackupManager;
@@ -42,7 +41,6 @@
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.os.Process;
 import android.os.UserHandle;
 
 import androidx.fragment.app.FragmentActivity;
@@ -77,6 +75,8 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.concurrent.TimeUnit;
+
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
         ShadowEntityHeaderController.class,
@@ -88,7 +88,6 @@
     private static final String SUMMARY = "summary";
     private static final String[] PACKAGE_NAME = {"com.android.app"};
     private static final String USAGE_PERCENT = "16%";
-    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 long BACKGROUND_TIME_MS = 100;
@@ -96,7 +95,6 @@
     private static final long FOREGROUND_SERVICE_TIME_MS = 444;
     private static final long FOREGROUND_TIME_MS =
             FOREGROUND_ACTIVITY_TIME_MS + FOREGROUND_SERVICE_TIME_MS;
-    private static final long FOREGROUND_SERVICE_TIME_US = FOREGROUND_SERVICE_TIME_MS * 1000;
     private static final String KEY_PREF_UNRESTRICTED = "unrestricted_pref";
     private static final String KEY_PREF_OPTIMIZED = "optimized_pref";
     private static final String KEY_PREF_RESTRICTED = "restricted_pref";
@@ -264,405 +262,6 @@
     }
 
     @Test
-    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();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEmpty();
-    }
-
-    @Test
-    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);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEmpty();
-    }
-
-    @Test
-    public void initHeader_ScreenTimeZerobackgroundTwoMin_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);
-        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: 2 min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeZerobackgroundLessThanAMin_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);
-        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(since last full charge)");
-    }
-
-    @Test
-    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();
-
-        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(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundLessThanAMin_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);
-        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(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundZero_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);
-        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);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .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();
-        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);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue()).isNotNull();
-    }
-
-    @Test
     public void startBatteryDetailPage_invalidToShowSummary_noFGBDData() {
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment,
                 mBatteryEntry, USAGE_PERCENT);
@@ -767,7 +366,7 @@
         mFragment.onRadioButtonClicked(mOptimizePreference);
         mFragment.onPause();
 
-        shadowMainLooper().idle();
+        TimeUnit.SECONDS.sleep(1);
         verify(mMetricsFeatureProvider)
                 .action(
                         SettingsEnums.OPEN_APP_BATTERY_USAGE,
@@ -791,7 +390,7 @@
         mFragment.onRadioButtonClicked(mOptimizePreference);
         mFragment.onPause();
 
-        shadowMainLooper().idle();
+        TimeUnit.SECONDS.sleep(1);
         verifyNoInteractions(mMetricsFeatureProvider);
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java
new file mode 100644
index 0000000..2449040
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2023 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.fuelgauge;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public final class PowerUsageTimeControllerTest {
+    private static final String SLOT_TIME = "12 am-2 am";
+    private static final String KEY_SCREEN_ON_TIME_PREF = "battery_usage_screen_time";
+    private static final String KEY_BACKGROUND_TIME_PREF = "battery_usage_background_time";
+    private static final String TEST_ANOMALY_HINT_TEXT = "test_anomaly_hint_text";
+
+    private Context mContext;
+    private PowerUsageTimeController mPowerUsageTimeController;
+
+    @Mock
+    private PreferenceCategory mPowerUsageTimeCategory;
+    @Mock
+    private PowerUsageTimePreference mScreenTimePreference;
+    @Mock
+    private PowerUsageTimePreference mBackgroundTimePreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        mPowerUsageTimeController = new PowerUsageTimeController(mContext);
+        mPowerUsageTimeController.mPowerUsageTimeCategory = mPowerUsageTimeCategory;
+        mPowerUsageTimeController.mScreenTimePreference = mScreenTimePreference;
+        mPowerUsageTimeController.mBackgroundTimePreference = mBackgroundTimePreference;
+        doReturn(KEY_SCREEN_ON_TIME_PREF).when(mScreenTimePreference).getKey();
+        doReturn(KEY_BACKGROUND_TIME_PREF).when(mBackgroundTimePreference).getKey();
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_noInfo_prefInvisible() {
+        mPowerUsageTimeController.handleScreenTimeUpdated(/*slotTime=*/ null,
+                /*screenOnTimeInMs=*/ 0, /*backgroundTimeInMs=*/ 0,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(false);
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_onlySlotTime_prefInvisible() {
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                /*screenOnTimeInMs=*/ 0, /*backgroundTimeInMs=*/ 0,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(false);
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_lackBackgroundTime_onlyScreenOnTime() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeZero = 0;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeZero,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyOnePreferenceInvisible(mBackgroundTimePreference);
+        verify(mScreenTimePreference).setTimeTitle("Screen time");
+        verify(mScreenTimePreference).setTimeSummary("1 min");
+        verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_lackScreenOnTime_onlyBackgroundTime() {
+        final long screenOnTimeZero = 0;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeZero, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyOnePreferenceInvisible(mScreenTimePreference);
+        verify(mBackgroundTimePreference).setTimeTitle("Background time");
+        verify(mBackgroundTimePreference).setTimeSummary("2 min");
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_categoryTitleWithSlotTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeTitle("Screen time");
+        verify(mScreenTimePreference).setTimeSummary("1 min");
+        verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
+        verify(mBackgroundTimePreference).setTimeTitle("Background time");
+        verify(mBackgroundTimePreference).setTimeSummary("2 min");
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+        verify(mPowerUsageTimeCategory).setTitle("App usage for 12 am-2 am");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_categoryTitleWithoutSlotTime_expectedResult() {
+        final long backgroundTimeTwoMinutes = 120000;
+        final long screenOnTimeAMinute = 60000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(/*slotTime=*/ null,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mPowerUsageTimeCategory).setTitle("App usage since last full charge");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_BackgroundLessThanAMinWithSlotTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeLessThanAMinute = 59999;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeLessThanAMinute,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("1 min");
+        verify(mBackgroundTimePreference).setTimeSummary("Less than a min");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_ScreenTimeLessThanAMin_expectedResult() {
+        final long screenOnTimeLessThanAMinute = 59999;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeLessThanAMinute, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("Less than a min");
+        verify(mBackgroundTimePreference).setTimeSummary("2 min");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_bothLessThanAMin_expectedResult() {
+        final long screenOnTimeLessThanAMinute = 59999;
+        final long backgroundTimeLessThanAMinute = 59999;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeLessThanAMinute, backgroundTimeLessThanAMinute,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("Less than a min");
+        verify(mBackgroundTimePreference).setTimeSummary("Less than a min");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_anomalyOfScreenOnTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                KEY_SCREEN_ON_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_anomalyOfBackgroundTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                KEY_BACKGROUND_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
+        verify(mBackgroundTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_anomalyOfScreenOnTimeWithoutTimeInfo_expectedResult() {
+        final long screenOnTimeZero = 0;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeZero, backgroundTimeTwoMinutes,
+                KEY_SCREEN_ON_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("Less than a min");
+        verify(mScreenTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    private void verifySetPrefToVisible(Preference pref, boolean isVisible) {
+        verify(pref, isVisible ? times(1) : never()).setVisible(true);
+    }
+
+    private void verifyAllPreferencesVisible(boolean isVisible) {
+        verifySetPrefToVisible(mScreenTimePreference, isVisible);
+        verifySetPrefToVisible(mBackgroundTimePreference, isVisible);
+        verifySetPrefToVisible(mPowerUsageTimeCategory, isVisible);
+    }
+
+    private void verifyOnePreferenceInvisible(Preference pref) {
+        verifySetPrefToVisible(mScreenTimePreference, mScreenTimePreference != pref);
+        verifySetPrefToVisible(mBackgroundTimePreference, mBackgroundTimePreference != pref);
+        verifySetPrefToVisible(mPowerUsageTimeCategory, mPowerUsageTimeCategory != pref);
+    }
+}
