Merge "[Settings] Code refactor - SIM slot UI preference key"
diff --git a/res/layout/preference_expand_divider.xml b/res/layout/preference_expand_divider.xml
deleted file mode 100644
index 9b76688..0000000
--- a/res/layout/preference_expand_divider.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright (C) 2021 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.
-  -->
-
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall"
-    android:gravity="center_vertical"
-    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:background="?android:attr/selectableItemBackground"
-    android:orientation="horizontal">
-
-    <TextView
-        android:id="@+id/expand_title"
-        android:layout_width="0px"
-        android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:paddingEnd="4dp"
-        android:textAlignment="viewStart"
-        style="@style/PreferenceCategoryTitleTextStyle"/>
-
-    <ImageView
-        android:id="@+id/expand_icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="@drawable/ic_settings_expand_more"/>
-
-</LinearLayout>
diff --git a/res/layout/preference_tab.xml b/res/layout/preference_tab.xml
new file mode 100644
index 0000000..f9a7881
--- /dev/null
+++ b/res/layout/preference_tab.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ 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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:theme="@style/Theme.TabTheme"
+    android:id="@+id/tab_container"
+    android:clipToPadding="true"
+    android:clipChildren="true"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <com.google.android.material.tabs.TabLayout
+        android:id="@+id/tabs"
+        style="@style/SettingsLibTabsStyle" />
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/view_pager"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0ff904d..0cd0c86 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4993,6 +4993,14 @@
     <string name="daily_battery_usage_chart">Daily battery usage chart</string>
     <!-- [CHAR_LIMIT=NONE] Accessibility content description for hourly battery chart view. -->
     <string name="hourly_battery_usage_chart">Hourly battery usage chart</string>
+    <!-- [CHAR_LIMIT=NONE] Battery usage breakdown title since last full charge -->
+    <string name="battery_usage_breakdown_title_since_last_full_charge">Usage proportional breakdown since last full charge</string>
+    <!-- [CHAR_LIMIT=NONE] Battery usage breakdown title for a selected slot -->
+    <string name="battery_usage_breakdown_title_for_slot">Usage proportional breakdown for <xliff:g id="slot">%s</xliff:g></string>
+    <!-- [CHAR_LIMIT=NONE] The tab title in the battery usage breakdown. -->
+    <string name="battery_usage_app_tab">App</string>
+    <!-- [CHAR_LIMIT=NONE] The tab title in the battery usage breakdown. -->
+    <string name="battery_usage_system_tab">System</string>
     <!-- Process Stats strings -->
     <skip />
 
@@ -8034,37 +8042,38 @@
     <!-- [CHAR LIMIT=NONE] eSim deletion confirmation description  -->
     <string name="confirm_sim_deletion_description">Verify it\u0027s you before erasing a eSIM</string>
 
-    <!-- TODO(b/258550150): Finalize all strings in this section and remove translatable="false" -->
     <!-- [CHAR LIMIT=32] Name of Advanced memory protection page in "More Security Settings" and heading of page. -->
-    <string name="memtag_title" translatable="false">Advanced memory protection beta</string>
+    <string name="memtag_title">Advanced memory protection beta</string>
     <!-- [CHAR LIMIT=52] Label for button to turn on / off Advanced memory protection.-->
-    <string name="memtag_toggle" translatable="false">Advanced memory protection</string>
+    <string name="memtag_toggle">Advanced memory protection</string>
     <!-- [CHAR LIMIT=NONE] Subtitle of Advanced memory protection page. -->
-    <string name="memtag_intro" translatable="false">This beta feature helps you protect your device from bugs that may put your security at risk.</string>
+    <string name="memtag_intro">This beta feature helps you protect your device from bugs that may put your security at risk.</string>
     <!-- [CHAR LIMIT=NONE] Status label indicating that Advanced memory protection is on. -->
-    <string name="memtag_on" translatable="false">On</string>
+    <string name="memtag_on">On</string>
     <!-- [CHAR LIMIT=37] Status label indicating that Advanced memory protection is off. -->
-    <string name="memtag_off" translatable="false">Off</string>
+    <string name="memtag_off">Off</string>
     <!-- [CHAR LIMIT=37] Status label indicating that system needs to be rebooted for Advanced memory protection to be on. -->
-    <string name="memtag_on_pending" translatable="false">On after restart</string>
+    <string name="memtag_on_pending">On after restart</string>
     <!-- [CHAR LIMIT=37] Status label indicating that system needs to be rebooted for Advanced memory protection to be off. -->
-    <string name="memtag_off_pending" translatable="false">Off after restart</string>
+    <string name="memtag_off_pending">Off after restart</string>
     <!-- [CHAR LIMIT=37] Status label indicating that Advanced memory protection was forced off via remote device configuration. -->
-    <string name="memtag_force_off" translatable="false">Currently unavailable for your device.</string>
+    <string name="memtag_force_off">Currently unavailable for your device</string>
+    <!-- [CHAR LIMIT=37] Status label indicating that Advanced memory protection was forced on via remote device configuration. -->
+    <string name="memtag_force_on">Always on for your device</string>
     <!-- [CHAR LIMIT=NONE] Subtext on page to control Advanced memory protection settings. -->
-    <string name="memtag_footer" translatable="false">You\u0027ll have to restart your device to turn Advanced memory protection on or off. When it\u0027s on, you may notice slower device performance.</string>
+    <string name="memtag_footer">You\u0027ll have to restart your device to turn Advanced memory protection on or off. When it\u0027s on, you may notice slower device performance.</string>
     <!-- [CHAR LIMIT=31] Header of dialog asking user to reboot device. -->
-    <string name="memtag_reboot_title" translatable="false">Restart device?</string>
+    <string name="memtag_reboot_title">Restart device?</string>
     <!-- [CHAR LIMIT=NONE] Message shown in dialog prompting user to reboot device to turn on Advanced memory protection.-->
-    <string name="memtag_reboot_message_on" translatable="false">You\u0027ll need to restart your device to turn on Advanced memory protection.</string>
+    <string name="memtag_reboot_message_on">You\u0027ll need to restart your device to turn on Advanced memory protection.</string>
     <!-- [CHAR LIMIT=NONE] Message shown in dialog prompting user to reboot device to turn off Advanced memory protection.-->
-    <string name="memtag_reboot_message_off" translatable="false">You\u0027ll need to restart your device to turn off Advanced memory protection.</string>
+    <string name="memtag_reboot_message_off">You\u0027ll need to restart your device to turn off Advanced memory protection.</string>
     <!-- [CHAR LIMIT=17] Button label in dialog prompting user to reboot device.-->
-    <string name="memtag_reboot_yes" translatable="false">Restart</string>
+    <string name="memtag_reboot_yes">Restart</string>
     <!-- [CHAR LIMIT=17] Button label in dialog prompting user to reboot device.-->
-    <string name="memtag_reboot_no" translatable="false">Not now</string>
+    <string name="memtag_reboot_no">Not now</string>
     <!-- [CHAR LIMIT=NONE] Label for Learn More link. -->
-    <string name="memtag_learn_more" translatable="false">Learn more about Advanced memory protection.</string>
+    <string name="memtag_learn_more">Learn more about Advanced memory protection.</string>
 
     <!-- Opening string on the dialog that prompts the user to confirm that they really want to delete their existing work profile. The administration app icon and name appear after the final colon. [CHAR LIMIT=NONE] -->
     <string name="opening_paragraph_delete_profile_unknown_company">This work profile is managed by:</string>
@@ -10652,8 +10661,8 @@
     <string name="lockscreen_double_line_clock_summary">Show double-line clock when available</string>
     <!-- Lockscreen double-line clock toggle [CHAR LIMIT=60] -->
     <string name="lockscreen_double_line_clock_setting_toggle">Double-line clock</string>
-    <!-- Lock screen buttons preference [CHAR LIMIT=60] -->
-    <string name="lockscreen_quick_affordances_title">Buttons</string>
+    <!-- Lock screen shortcuts preference [CHAR LIMIT=60] -->
+    <string name="lockscreen_quick_affordances_title">Shortcuts</string>
     <!-- Summary for the lock screen button preference [CHAR LIMIT=60] -->
     <plurals name="lockscreen_quick_affordances_summary">
         <item quantity="zero">None</item>
diff --git a/res/xml/power_usage_advanced.xml b/res/xml/power_usage_advanced.xml
index e9274ce..4371995 100644
--- a/res/xml/power_usage_advanced.xml
+++ b/res/xml/power_usage_advanced.xml
@@ -22,14 +22,30 @@
     settings:keywords="@string/keywords_battery_usage">
 
     <com.android.settings.fuelgauge.batteryusage.BatteryHistoryPreference
-        android:key="battery_graph"/>
+        android:key="battery_chart"
+        settings:controller=
+            "com.android.settings.fuelgauge.batteryusage.BatteryChartPreferenceController" />
 
     <PreferenceCategory
-        android:key="app_list"/>
+        android:key="battery_usage_breakdown"
+        settings:controller=
+            "com.android.settings.fuelgauge.batteryusage.BatteryUsageBreakdownController"
+        settings:isPreferenceVisible="false">
 
-    <com.android.settingslib.widget.FooterPreference
-        android:key="battery_graph_footer"
-        android:title="@string/battery_usage_screen_footer"
-        android:selectable="false"
-        settings:searchable="false"/>
+        <com.android.settings.fuelgauge.batteryusage.TabPreference
+            android:key="battery_usage_tab"
+            settings:isPreferenceVisible="false" />
+
+        <PreferenceCategory
+            android:key="app_list"
+            settings:isPreferenceVisible="false" />
+
+        <com.android.settingslib.widget.FooterPreference
+            android:key="battery_usage_footer"
+            android:selectable="false"
+            android:title="@string/battery_usage_screen_footer"
+            settings:isPreferenceVisible="false"
+            settings:searchable="false" />
+
+    </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectRecentLocationRequestFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectRecentLocationRequestFragment.java
deleted file mode 100644
index 16cb43c..0000000
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectRecentLocationRequestFragment.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2019 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.dashboard.profileselector;
-
-import android.os.Bundle;
-
-import androidx.fragment.app.Fragment;
-
-import com.android.settings.R;
-import com.android.settings.location.RecentLocationRequestSeeAllFragment;
-
-/**
- * Recent location request page for personal/managed profile.
- */
-public class ProfileSelectRecentLocationRequestFragment extends ProfileSelectFragment {
-
-    @Override
-    public Fragment[] getFragments() {
-        final Bundle workOnly = new Bundle();
-        workOnly.putInt(EXTRA_PROFILE, ProfileSelectFragment.ProfileType.WORK);
-        final Fragment workFragment = new RecentLocationRequestSeeAllFragment();
-        workFragment.setArguments(workOnly);
-
-        final Bundle personalOnly = new Bundle();
-        personalOnly.putInt(EXTRA_PROFILE, ProfileSelectFragment.ProfileType.PERSONAL);
-        final Fragment personalFragment = new RecentLocationRequestSeeAllFragment();
-        personalFragment.setArguments(personalOnly);
-        return new Fragment[]{
-                personalFragment, //0
-                workFragment
-        };
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.location_recent_requests_header;
-    }
-}
diff --git a/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceController.java b/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceController.java
index 94f1519..2c06a51 100644
--- a/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceController.java
+++ b/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceController.java
@@ -50,13 +50,13 @@
         final Preference preference = screen.findPreference(getPreferenceKey());
         if (preference != null) {
             preference.setOnPreferenceClickListener(preference1 -> {
-                // TODO(b/258471384): open the buttons destination within wallpaper picker.
                 final Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER);
                 final String packageName =
                         mContext.getString(R.string.config_wallpaper_picker_package);
                 if (!TextUtils.isEmpty(packageName)) {
                     intent.setPackage(packageName);
                 }
+                intent.putExtra("destination", "quick_affordances");
                 mContext.startActivity(intent);
                 return true;
             });
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index 90610f8..7e1bb38 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -21,30 +21,22 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.res.Configuration;
-import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
-import android.text.TextUtils;
 import android.text.format.DateFormat;
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.view.View;
-import android.view.accessibility.AccessibilityManager;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceGroup;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
-import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
-import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -54,73 +46,68 @@
 import com.android.settingslib.core.lifecycle.events.OnDestroy;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
-import com.android.settingslib.utils.StringUtil;
-import com.android.settingslib.widget.FooterPreference;
 
 import java.util.ArrayList;
 import java.util.Calendar;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 /** Controls the update for chart graph and the list items. */
 public class BatteryChartPreferenceController extends AbstractPreferenceController
         implements PreferenceControllerMixin, LifecycleObserver, OnCreate, OnDestroy,
-        OnSaveInstanceState, OnResume, ExpandDividerPreference.OnExpandListener {
+        OnSaveInstanceState, OnResume {
     private static final String TAG = "BatteryChartPreferenceController";
-    private static final String KEY_FOOTER_PREF = "battery_graph_footer";
-    private static final String PACKAGE_NAME_NONE = "none";
-    private static final int ENABLED_ICON_ALPHA = 255;
-    private static final int DISABLED_ICON_ALPHA = 255 / 3;
+    private static final String PREFERENCE_KEY = "battery_chart";
 
     private static final long FADE_IN_ANIMATION_DURATION = 400L;
     private static final long FADE_OUT_ANIMATION_DURATION = 200L;
 
     // Keys for bundle instance to restore configurations.
-    private static final String KEY_EXPAND_SYSTEM_INFO = "expand_system_info";
     private static final String KEY_DAILY_CHART_INDEX = "daily_chart_index";
     private static final String KEY_HOURLY_CHART_INDEX = "hourly_chart_index";
 
     private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
 
-    @VisibleForTesting
-    Map<Integer, Map<Integer, BatteryDiffData>> mBatteryUsageMap;
+    /**
+     * A callback listener for battery usage is updated.
+     * This happens when battery usage data is ready or the selected index is changed.
+     */
+    public interface OnBatteryUsageUpdatedListener {
+        /**
+         * The callback function for battery usage is updated.
+         * @param slotUsageData The battery usage diff data for the selected slot. This is used in
+         *                      the app list.
+         * @param slotTimestamp The selected slot timestamp information. This is used in the battery
+         *                      usage breakdown category.
+         * @param isAllUsageDataEmpty Whether all the battery usage data is null or empty. This is
+         *                            used when showing the footer.
+         */
+        void onBatteryUsageUpdated(
+                BatteryDiffData slotUsageData, String slotTimestamp, boolean isAllUsageDataEmpty);
+    }
 
     @VisibleForTesting
     Context mPrefContext;
     @VisibleForTesting
-    BatteryUtils mBatteryUtils;
-    @VisibleForTesting
-    PreferenceGroup mAppListPrefGroup;
-    @VisibleForTesting
-    ExpandDividerPreference mExpandDividerPreference;
-    @VisibleForTesting
-    boolean mIsExpanded = false;
-
-    @VisibleForTesting
     BatteryChartView mDailyChartView;
     @VisibleForTesting
     BatteryChartView mHourlyChartView;
-
     @VisibleForTesting
     int mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
     @VisibleForTesting
     int mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+    @VisibleForTesting
+    Map<Integer, Map<Integer, BatteryDiffData>> mBatteryUsageMap;
 
     private boolean mIs24HourFormat;
-    private boolean mIsFooterPrefAdded = false;
     private boolean mHourlyChartVisible = true;
     private View mBatteryChartViewGroup;
-    private View mCategoryTitleView;
-    private PreferenceScreen mPreferenceScreen;
-    private FooterPreference mFooterPreference;
     private TextView mChartSummaryTextView;
     private BatteryChartViewModel mDailyViewModel;
     private List<BatteryChartViewModel> mHourlyViewModels;
+    private OnBatteryUsageUpdatedListener mOnBatteryUsageUpdatedListener;
 
-    private final String mPreferenceKey;
     private final SettingsActivity mActivity;
-    private final InstrumentedPreferenceFragment mFragment;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
     private final Handler mHandler = new Handler(Looper.getMainLooper());
     private final AnimatorListenerAdapter mHourlyChartFadeInAdapter =
@@ -135,18 +122,10 @@
     final HourlyChartLabelTextGenerator mHourlyChartLabelTextGenerator =
             new HourlyChartLabelTextGenerator();
 
-    // Preference cache to avoid create new instance each time.
-    @VisibleForTesting
-    final Map<String, Preference> mPreferenceCache = new HashMap<>();
-
     public BatteryChartPreferenceController(
-            Context context, String preferenceKey,
-            Lifecycle lifecycle, SettingsActivity activity,
-            InstrumentedPreferenceFragment fragment) {
+            Context context, Lifecycle lifecycle, SettingsActivity activity) {
         super(context);
         mActivity = activity;
-        mFragment = fragment;
-        mPreferenceKey = preferenceKey;
         mIs24HourFormat = DateFormat.is24HourFormat(context);
         mMetricsFeatureProvider =
                 FeatureFactory.getFactory(mContext).getMetricsFeatureProvider();
@@ -164,10 +143,8 @@
                 savedInstanceState.getInt(KEY_DAILY_CHART_INDEX, mDailyChartIndex);
         mHourlyChartIndex =
                 savedInstanceState.getInt(KEY_HOURLY_CHART_INDEX, mHourlyChartIndex);
-        mIsExpanded =
-                savedInstanceState.getBoolean(KEY_EXPAND_SYSTEM_INFO, mIsExpanded);
-        Log.d(TAG, String.format("onCreate() dailyIndex=%d hourlyIndex=%d isExpanded=%b",
-                mDailyChartIndex, mHourlyChartIndex, mIsExpanded));
+        Log.d(TAG, String.format("onCreate() dailyIndex=%d hourlyIndex=%d",
+                mDailyChartIndex, mHourlyChartIndex));
     }
 
     @Override
@@ -191,9 +168,8 @@
         }
         savedInstance.putInt(KEY_DAILY_CHART_INDEX, mDailyChartIndex);
         savedInstance.putInt(KEY_HOURLY_CHART_INDEX, mHourlyChartIndex);
-        savedInstance.putBoolean(KEY_EXPAND_SYSTEM_INFO, mIsExpanded);
-        Log.d(TAG, String.format("onSaveInstanceState() dailyIndex=%d hourlyIndex=%d isExpanded=%b",
-                mDailyChartIndex, mHourlyChartIndex, mIsExpanded));
+        Log.d(TAG, String.format("onSaveInstanceState() dailyIndex=%d hourlyIndex=%d",
+                mDailyChartIndex, mHourlyChartIndex));
     }
 
     @Override
@@ -202,25 +178,12 @@
             BatteryDiffEntry.clearCache();
         }
         mHandler.removeCallbacksAndMessages(/*token=*/ null);
-        mPreferenceCache.clear();
-        if (mAppListPrefGroup != null) {
-            mAppListPrefGroup.removeAll();
-        }
     }
 
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        mPreferenceScreen = screen;
         mPrefContext = screen.getContext();
-        mAppListPrefGroup = screen.findPreference(mPreferenceKey);
-        mAppListPrefGroup.setOrderingAsAdded(false);
-        mAppListPrefGroup.setTitle("");
-        mFooterPreference = screen.findPreference(KEY_FOOTER_PREF);
-        // Removes footer first until usage data is loaded to avoid flashing.
-        if (mFooterPreference != null) {
-            screen.removePreference(mFooterPreference);
-        }
     }
 
     @Override
@@ -230,42 +193,11 @@
 
     @Override
     public String getPreferenceKey() {
-        return mPreferenceKey;
+        return PREFERENCE_KEY;
     }
 
-    @Override
-    public boolean handlePreferenceTreeClick(Preference preference) {
-        if (!(preference instanceof PowerGaugePreference)) {
-            return false;
-        }
-        final PowerGaugePreference powerPref = (PowerGaugePreference) preference;
-        final BatteryDiffEntry diffEntry = powerPref.getBatteryDiffEntry();
-        final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
-        final String packageName = histEntry.mPackageName;
-        final boolean isAppEntry = histEntry.isAppEntry();
-        mMetricsFeatureProvider.action(
-                /* attribution */ SettingsEnums.OPEN_BATTERY_USAGE,
-                /* action */ isAppEntry
-                        ? SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM
-                        : SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
-                /* pageId */ SettingsEnums.OPEN_BATTERY_USAGE,
-                TextUtils.isEmpty(packageName) ? PACKAGE_NAME_NONE : packageName,
-                (int) Math.round(diffEntry.getPercentOfTotal()));
-        Log.d(TAG, String.format("handleClick() label=%s key=%s package=%s",
-                diffEntry.getAppLabel(), histEntry.getKey(), histEntry.mPackageName));
-        AdvancedPowerUsageDetail.startBatteryDetailPage(
-                mActivity, mFragment, diffEntry, powerPref.getPercent(), getSlotInformation());
-        return true;
-    }
-
-    @Override
-    public void onExpand(boolean isExpanded) {
-        mIsExpanded = isExpanded;
-        mMetricsFeatureProvider.action(
-                mPrefContext,
-                SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
-                isExpanded);
-        refreshExpandUi();
+    void setOnBatteryUsageUpdatedListener(OnBatteryUsageUpdatedListener listener) {
+        mOnBatteryUsageUpdatedListener = listener;
     }
 
     void setBatteryHistoryMap(
@@ -339,7 +271,6 @@
             mDailyChartIndex = trapezoidIndex;
             mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
             refreshUi();
-            requestAccessibilityFocusForCategoryTitle(mDailyChartView);
             mMetricsFeatureProvider.action(
                     mPrefContext,
                     trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
@@ -355,7 +286,6 @@
             Log.d(TAG, "onHourlyChartSelect:" + trapezoidIndex);
             mHourlyChartIndex = trapezoidIndex;
             refreshUi();
-            requestAccessibilityFocusForCategoryTitle(mHourlyChartView);
             mMetricsFeatureProvider.action(
                     mPrefContext,
                     trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
@@ -385,14 +315,13 @@
             return false;
         }
 
-        mHandler.post(() -> {
-            final long start = System.currentTimeMillis();
-            removeAndCacheAllPrefs();
-            addAllPreferences();
-            refreshCategoryTitle();
-            Log.d(TAG, String.format("refreshUi is finished in %d/ms",
-                    (System.currentTimeMillis() - start)));
-        });
+
+        if (mOnBatteryUsageUpdatedListener != null) {
+            final BatteryDiffData slotUsageData =
+                    mBatteryUsageMap.get(mDailyChartIndex).get(mHourlyChartIndex);
+            mOnBatteryUsageUpdatedListener.onBatteryUsageUpdated(
+                    slotUsageData, getSlotInformation(), isBatteryUsageMapNullOrEmpty());
+        }
         return true;
     }
 
@@ -414,9 +343,6 @@
             mDailyChartView.setVisibility(View.GONE);
             mHourlyChartView.setVisibility(View.VISIBLE);
             mHourlyChartView.setViewModel(null);
-            removeAndCacheAllPrefs();
-            addFooterPreferenceIfNeeded(false);
-            return false;
         }
         return true;
     }
@@ -452,154 +378,6 @@
         return true;
     }
 
-    private void addAllPreferences() {
-        final BatteryDiffData batteryDiffData =
-                mBatteryUsageMap.get(mDailyChartIndex).get(mHourlyChartIndex);
-        addFooterPreferenceIfNeeded(batteryDiffData != null
-                && (!batteryDiffData.getAppDiffEntryList().isEmpty()
-                || !batteryDiffData.getSystemDiffEntryList().isEmpty()));
-        if (batteryDiffData == null) {
-            Log.w(TAG, "cannot find BatteryDiffEntry for daily_index: " + mDailyChartIndex
-                    + " hourly_index: " + mHourlyChartIndex);
-            return;
-        }
-        // Adds app entries to the list if it is not empty.
-        if (!batteryDiffData.getAppDiffEntryList().isEmpty()) {
-            addPreferenceToScreen(batteryDiffData.getAppDiffEntryList());
-        }
-        // Adds the expandable divider if we have system entries data.
-        if (!batteryDiffData.getSystemDiffEntryList().isEmpty()) {
-            if (mExpandDividerPreference == null) {
-                mExpandDividerPreference = new ExpandDividerPreference(mPrefContext);
-                mExpandDividerPreference.setOnExpandListener(this);
-                mExpandDividerPreference.setIsExpanded(mIsExpanded);
-            }
-            mExpandDividerPreference.setOrder(
-                    mAppListPrefGroup.getPreferenceCount());
-            mAppListPrefGroup.addPreference(mExpandDividerPreference);
-        }
-        refreshExpandUi();
-    }
-
-    @VisibleForTesting
-    void addPreferenceToScreen(List<BatteryDiffEntry> entries) {
-        if (mAppListPrefGroup == null || entries.isEmpty()) {
-            return;
-        }
-        int prefIndex = mAppListPrefGroup.getPreferenceCount();
-        for (BatteryDiffEntry entry : entries) {
-            boolean isAdded = false;
-            final String appLabel = entry.getAppLabel();
-            final Drawable appIcon = entry.getAppIcon();
-            if (TextUtils.isEmpty(appLabel) || appIcon == null) {
-                Log.w(TAG, "cannot find app resource for:" + entry.getPackageName());
-                continue;
-            }
-            final String prefKey = entry.mBatteryHistEntry.getKey();
-            PowerGaugePreference pref = mAppListPrefGroup.findPreference(prefKey);
-            if (pref != null) {
-                isAdded = true;
-                Log.w(TAG, "preference should be removed for:" + entry.getPackageName());
-            } else {
-                pref = (PowerGaugePreference) mPreferenceCache.get(prefKey);
-            }
-            // Creates new innstance if cached preference is not found.
-            if (pref == null) {
-                pref = new PowerGaugePreference(mPrefContext);
-                pref.setKey(prefKey);
-                mPreferenceCache.put(prefKey, pref);
-            }
-            pref.setIcon(appIcon);
-            pref.setTitle(appLabel);
-            pref.setOrder(prefIndex);
-            pref.setPercent(entry.getPercentOfTotal());
-            pref.setSingleLineTitle(true);
-            // Sets the BatteryDiffEntry to preference for launching detailed page.
-            pref.setBatteryDiffEntry(entry);
-            pref.setEnabled(entry.validForRestriction());
-            setPreferenceSummary(pref, entry);
-            if (!isAdded) {
-                mAppListPrefGroup.addPreference(pref);
-            }
-            appIcon.setAlpha(pref.isEnabled() ? ENABLED_ICON_ALPHA : DISABLED_ICON_ALPHA);
-            prefIndex++;
-        }
-    }
-
-    private void removeAndCacheAllPrefs() {
-        if (mAppListPrefGroup == null
-                || mAppListPrefGroup.getPreferenceCount() == 0) {
-            return;
-        }
-        final int prefsCount = mAppListPrefGroup.getPreferenceCount();
-        for (int index = 0; index < prefsCount; index++) {
-            final Preference pref = mAppListPrefGroup.getPreference(index);
-            if (TextUtils.isEmpty(pref.getKey())) {
-                continue;
-            }
-            mPreferenceCache.put(pref.getKey(), pref);
-        }
-        mAppListPrefGroup.removeAll();
-    }
-
-    private void refreshExpandUi() {
-        final List<BatteryDiffEntry> systemEntries = mBatteryUsageMap.get(mDailyChartIndex).get(
-                mHourlyChartIndex).getSystemDiffEntryList();
-        if (mIsExpanded) {
-            addPreferenceToScreen(systemEntries);
-        } else {
-            // Removes and recycles all system entries to hide all of them.
-            for (BatteryDiffEntry entry : systemEntries) {
-                final String prefKey = entry.mBatteryHistEntry.getKey();
-                final Preference pref = mAppListPrefGroup.findPreference(prefKey);
-                if (pref != null) {
-                    mAppListPrefGroup.removePreference(pref);
-                    mPreferenceCache.put(pref.getKey(), pref);
-                }
-            }
-        }
-    }
-
-    @VisibleForTesting
-    void refreshCategoryTitle() {
-        final String slotInformation = getSlotInformation();
-        Log.d(TAG, String.format("refreshCategoryTitle:%s", slotInformation));
-        if (mAppListPrefGroup != null) {
-            mAppListPrefGroup.setTitle(
-                    getSlotInformation(/*isApp=*/ true, slotInformation));
-        }
-        if (mExpandDividerPreference != null) {
-            mExpandDividerPreference.setTitle(
-                    getSlotInformation(/*isApp=*/ false, slotInformation));
-        }
-    }
-
-    private void requestAccessibilityFocusForCategoryTitle(View view) {
-        if (!AccessibilityManager.getInstance(mContext).isEnabled()) {
-            return;
-        }
-        if (mCategoryTitleView == null) {
-            mCategoryTitleView = view.getRootView().findViewById(com.android.internal.R.id.title);
-        }
-        if (mCategoryTitleView != null) {
-            mCategoryTitleView.requestAccessibilityFocus();
-        }
-    }
-
-    private String getSlotInformation(boolean isApp, String slotInformation) {
-        // TODO: Updates the right slot information from daily and hourly chart selection.
-        // Null means we show all information without a specific time slot.
-        if (slotInformation == null) {
-            return isApp
-                    ? mPrefContext.getString(R.string.battery_app_usage)
-                    : mPrefContext.getString(R.string.battery_system_usage);
-        } else {
-            return isApp
-                    ? mPrefContext.getString(R.string.battery_app_usage_for, slotInformation)
-                    : mPrefContext.getString(R.string.battery_system_usage_for, slotInformation);
-        }
-    }
-
     @VisibleForTesting
     String getSlotInformation() {
         if (mDailyViewModel == null || mHourlyViewModels == null) {
@@ -624,51 +402,6 @@
         return String.format("%s %s", selectedDayText, selectedHourText);
     }
 
-    @VisibleForTesting
-    void setPreferenceSummary(
-            PowerGaugePreference preference, BatteryDiffEntry entry) {
-        final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
-        final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
-        // TODO: update this value after the new API for foreground service is completed.
-        final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
-        String usageTimeSummary = null;
-        // Not shows summary for some system components without usage time.
-        if (totalUsageTimeInMs == 0) {
-            preference.setSummary(null);
-            // Shows background summary only if we don't have foreground usage time.
-        } else if (foregroundUsageTimeInMs == 0 && backgroundUsageTimeInMs != 0) {
-            usageTimeSummary = buildUsageTimeInfo(backgroundUsageTimeInMs, true);
-            // Shows total usage summary only if total usage time is small.
-        } else if (totalUsageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
-            usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
-        } else {
-            usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
-            // Shows background usage time if it is larger than a minute.
-            if (backgroundUsageTimeInMs > 0) {
-                usageTimeSummary +=
-                        "\n" + buildUsageTimeInfo(backgroundUsageTimeInMs, true);
-            }
-        }
-        preference.setSummary(usageTimeSummary);
-    }
-
-    private String buildUsageTimeInfo(long usageTimeInMs, boolean isBackground) {
-        if (usageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
-            return mPrefContext.getString(
-                    isBackground
-                            ? R.string.battery_usage_background_less_than_one_minute
-                            : R.string.battery_usage_total_less_than_one_minute);
-        }
-        final CharSequence timeSequence =
-                StringUtil.formatElapsedTime(mPrefContext, usageTimeInMs,
-                        /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
-        final int resourceId =
-                isBackground
-                        ? R.string.battery_usage_for_background_time
-                        : R.string.battery_usage_for_total_time;
-        return mPrefContext.getString(resourceId, timeSequence);
-    }
-
     private void animateBatteryChartViewGroup() {
         if (mBatteryChartViewGroup != null && mBatteryChartViewGroup.getAlpha() == 0) {
             mBatteryChartViewGroup.animate().alpha(1f).setDuration(FADE_IN_ANIMATION_DURATION)
@@ -726,18 +459,6 @@
         };
     }
 
-    private void addFooterPreferenceIfNeeded(boolean containAppItems) {
-        if (mIsFooterPrefAdded || mFooterPreference == null) {
-            return;
-        }
-        mIsFooterPrefAdded = true;
-        mFooterPreference.setTitle(mPrefContext.getString(
-                containAppItems
-                        ? R.string.battery_usage_screen_footer
-                        : R.string.battery_usage_screen_footer_empty));
-        mHandler.post(() -> mPreferenceScreen.addPreference(mFooterPreference));
-    }
-
     private boolean isBatteryLevelDataInOneDay() {
         return mHourlyViewModels != null && mHourlyViewModels.size() == 1;
     }
@@ -748,6 +469,19 @@
                 && mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL;
     }
 
+    private boolean isBatteryUsageMapNullOrEmpty() {
+        if (mBatteryUsageMap == null) {
+            return true;
+        }
+        BatteryDiffData allBatteryDiffData = mBatteryUsageMap
+                .get(BatteryChartViewModel.SELECTED_INDEX_ALL)
+                .get(BatteryChartViewModel.SELECTED_INDEX_ALL);
+        // If all data is null or empty, each slot must be null or empty.
+        return allBatteryDiffData == null
+                || (allBatteryDiffData.getAppDiffEntryList().isEmpty()
+                && allBatteryDiffData.getSystemDiffEntryList().isEmpty());
+    }
+
     @VisibleForTesting
     static int getTotalHours(final BatteryLevelData batteryLevelData) {
         if (batteryLevelData == null) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
index 32711bf..496200e 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntry.java
@@ -52,7 +52,6 @@
             (a, b) -> Double.compare(b.getPercentOfTotal(), a.getPercentOfTotal());
 
     public long mForegroundUsageTimeInMs;
-    public long mForegroundServiceUsageTimeInMs;
     public long mBackgroundUsageTimeInMs;
     public double mConsumePower;
     public double mForegroundUsageConsumePower;
@@ -83,7 +82,6 @@
     public BatteryDiffEntry(
             Context context,
             long foregroundUsageTimeInMs,
-            long foregroundServiceUsageTimeInMs,
             long backgroundUsageTimeInMs,
             double consumePower,
             double foregroundUsageConsumePower,
@@ -98,7 +96,6 @@
         mBackgroundUsageConsumePower = backgroundUsageConsumePower;
         mCachedUsageConsumePower = cachedUsageConsumePower;
         mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
-        mForegroundServiceUsageTimeInMs = foregroundServiceUsageTimeInMs;
         mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
         mBatteryHistEntry = batteryHistEntry;
         mUserManager = context.getSystemService(UserManager.class);
@@ -121,7 +118,6 @@
         return new BatteryDiffEntry(
                 this.mContext,
                 this.mForegroundUsageTimeInMs,
-                this.mForegroundServiceUsageTimeInMs,
                 this.mBackgroundUsageTimeInMs,
                 this.mConsumePower,
                 this.mForegroundUsageConsumePower,
@@ -385,14 +381,9 @@
                         mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
                 .append(String.format("\n\tconsume power= background:%f cached:%f",
                         mBackgroundUsageConsumePower, mCachedUsageConsumePower))
-                .append(String.format("\n\ttime= foreground:%s foregroundService:%s background:%s",
+                .append(String.format("\n\ttime= foreground:%s background:%s",
                         StringUtil.formatElapsedTime(mContext, (double) mForegroundUsageTimeInMs,
                                 /*withSeconds=*/ true, /*collapseTimeUnit=*/ false),
-                        StringUtil.formatElapsedTime(
-                                mContext,
-                                (double) mForegroundServiceUsageTimeInMs,
-                                /*withSeconds=*/ true,
-                                /*collapseTimeUnit=*/ false),
                         StringUtil.formatElapsedTime(mContext, (double) mBackgroundUsageTimeInMs,
                                 /*withSeconds=*/ true, /*collapseTimeUnit=*/ false)))
                 .append(String.format("\n\tpackage:%s|%s uid:%d userId:%d",
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
index 36a9248..2b56cc1 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java
@@ -112,7 +112,6 @@
     private final int mPowerComponentId;
     private long mUsageDurationMs;
     private long mTimeInForegroundMs;
-    private long mTimeInForegroundServiceMs;
     private long mTimeInBackgroundMs;
 
     public String mName;
@@ -176,9 +175,6 @@
             getQuickNameIconForUid(uid, packages, loadDataInBackground);
             mTimeInForegroundMs =
                     uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
-            //TODO: update this to the correct API after the new API is completed.
-            mTimeInForegroundServiceMs =
-                    uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
             mTimeInBackgroundMs =
                     uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND);
             mConsumedPowerInForeground = safeGetConsumedPower(
@@ -436,15 +432,6 @@
         }
     }
 
-    /** Returns foreground service time/ms that is attributed to this entry. */
-    public long getTimeInForegroundServiceMs() {
-        if (mBatteryConsumer instanceof UidBatteryConsumer) {
-            return mTimeInForegroundServiceMs;
-        } else {
-            return 0;
-        }
-    }
-
     /** Returns background activity time/ms that is attributed to this entry. */
     public long getTimeInBackgroundMs() {
         if (mBatteryConsumer instanceof UidBatteryConsumer) {
@@ -518,9 +505,6 @@
             UidBatteryConsumer uidBatteryConsumer = (UidBatteryConsumer) batteryConsumer;
             mTimeInForegroundMs += uidBatteryConsumer.getTimeInStateMs(
                     UidBatteryConsumer.STATE_FOREGROUND);
-            //TODO: update this to the correct API after the new API is completed.
-            mTimeInForegroundServiceMs += uidBatteryConsumer.getTimeInStateMs(
-                    UidBatteryConsumer.STATE_FOREGROUND);
             mTimeInBackgroundMs += uidBatteryConsumer.getTimeInStateMs(
                     UidBatteryConsumer.STATE_BACKGROUND);
             mConsumedPowerInForeground += safeGetConsumedPower(
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
index 5cd63e8..2cfb526 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntry.java
@@ -56,7 +56,6 @@
     public final double mCachedUsageConsumePower;
     public final double mPercentOfTotal;
     public final long mForegroundUsageTimeInMs;
-    public final long mForegroundServiceUsageTimeInMs;
     public final long mBackgroundUsageTimeInMs;
     @BatteryConsumer.PowerComponent
     public final int mDrainType;
@@ -91,7 +90,6 @@
         mCachedUsageConsumePower = batteryInformation.getCachedUsageConsumePower();
         mPercentOfTotal = batteryInformation.getPercentOfTotal();
         mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
-        mForegroundServiceUsageTimeInMs = batteryInformation.getForegroundServiceUsageTimeInMs();
         mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
         mDrainType = batteryInformation.getDrainType();
         final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
@@ -121,7 +119,6 @@
         mCachedUsageConsumePower = batteryInformation.getCachedUsageConsumePower();
         mPercentOfTotal = batteryInformation.getPercentOfTotal();
         mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
-        mForegroundServiceUsageTimeInMs = batteryInformation.getForegroundServiceUsageTimeInMs();
         mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
         mDrainType = batteryInformation.getDrainType();
         final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
@@ -141,7 +138,6 @@
             double backgroundUsageConsumePower,
             double cachedUsageConsumePower,
             long foregroundUsageTimeInMs,
-            long foregroundServiceUsageTimeInMs,
             long backgroundUsageTimeInMs,
             int batteryLevel) {
         mUid = fromEntry.mUid;
@@ -160,7 +156,6 @@
         mCachedUsageConsumePower = cachedUsageConsumePower;
         mPercentOfTotal = fromEntry.mPercentOfTotal;
         mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
-        mForegroundServiceUsageTimeInMs = foregroundServiceUsageTimeInMs;
         mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
         mDrainType = fromEntry.mDrainType;
         mConsumerType = fromEntry.mConsumerType;
@@ -223,9 +218,8 @@
                         mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
                 .append(String.format("\n\tbackground=%f|cached=%f",
                         mBackgroundUsageConsumePower, mCachedUsageConsumePower))
-                .append(String.format("\n\telapsedTime=%d|%d|%d",
+                .append(String.format("\n\telapsedTime=%d|%d",
                         Duration.ofMillis(mForegroundUsageTimeInMs).getSeconds(),
-                        Duration.ofMillis(mForegroundServiceUsageTimeInMs).getSeconds(),
                         Duration.ofMillis(mBackgroundUsageTimeInMs).getSeconds()))
                 .append(String.format("\n\tdrainType=%d|consumerType=%d",
                         mDrainType, mConsumerType))
@@ -320,12 +314,6 @@
                 (double) (lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageTimeInMs),
                 (double) upperHistEntry.mForegroundUsageTimeInMs,
                 ratio);
-        final double foregroundServiceUsageTimeInMs = interpolate(
-                (double) (lowerHistEntry == null
-                        ? 0
-                        : lowerHistEntry.mForegroundServiceUsageTimeInMs),
-                (double) upperHistEntry.mForegroundServiceUsageTimeInMs,
-                ratio);
         final double backgroundUsageTimeInMs = interpolate(
                 (double) (lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageTimeInMs),
                 (double) upperHistEntry.mBackgroundUsageTimeInMs,
@@ -338,7 +326,6 @@
                 || upperHistEntry.mBackgroundUsageConsumePower < backgroundUsageConsumePower
                 || upperHistEntry.mCachedUsageConsumePower < cachedUsageConsumePower
                 || upperHistEntry.mForegroundUsageTimeInMs < foregroundUsageTimeInMs
-                || upperHistEntry.mForegroundServiceUsageTimeInMs < foregroundServiceUsageTimeInMs
                 || upperHistEntry.mBackgroundUsageTimeInMs < backgroundUsageTimeInMs) {
             if (DEBUG) {
                 Log.w(TAG, String.format(
@@ -365,7 +352,6 @@
                 backgroundUsageConsumePower,
                 cachedUsageConsumePower,
                 Math.round(foregroundUsageTimeInMs),
-                Math.round(foregroundServiceUsageTimeInMs),
                 Math.round(backgroundUsageTimeInMs),
                 (int) Math.round(batteryLevel));
     }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
new file mode 100644
index 0000000..1452b54
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java
@@ -0,0 +1,326 @@
+/*
+ * 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.fuelgauge.batteryusage;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.TextUtils;
+import android.text.format.DateUtils;
+import android.util.Log;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceScreen;
+import androidx.viewpager2.widget.ViewPager2;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.fuelgauge.AdvancedPowerUsageDetail;
+import com.android.settings.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;
+import java.util.List;
+import java.util.Map;
+
+/** Controller for battery usage breakdown preference group. */
+public class BatteryUsageBreakdownController extends BasePreferenceController
+        implements LifecycleObserver, OnDestroy  {
+    private static final String TAG = "BatteryUsageBreakdownController";
+    private static final String ROOT_PREFERENCE_KEY = "battery_usage_breakdown";
+    private static final String FOOTER_PREFERENCE_KEY = "battery_usage_footer";
+    private static final String TAB_PREFERENCE_KEY = "battery_usage_tab";
+    private static final String APP_LIST_PREFERENCE_KEY = "app_list";
+    private static final String PACKAGE_NAME_NONE = "none";
+    private static final int ENABLED_ICON_ALPHA = 255;
+    private static final int DISABLED_ICON_ALPHA = 255 / 3;
+
+    private final SettingsActivity mActivity;
+    private final InstrumentedPreferenceFragment mFragment;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+    @VisibleForTesting
+    final Map<String, Preference> mPreferenceCache = new HashMap<>();
+
+    private int mTabPosition;
+    private String mSlotTimestamp;
+
+    @VisibleForTesting
+    Context mPrefContext;
+    @VisibleForTesting
+    PreferenceCategory mRootPreference;
+    @VisibleForTesting
+    TabPreference mTabPreference;
+    @VisibleForTesting
+    PreferenceGroup mAppListPreferenceGroup;
+    @VisibleForTesting
+    FooterPreference mFooterPreference;
+    @VisibleForTesting
+    BatteryDiffData mBatteryDiffData;
+
+    public BatteryUsageBreakdownController(
+            Context context, Lifecycle lifecycle, SettingsActivity activity,
+            InstrumentedPreferenceFragment fragment) {
+        super(context, ROOT_PREFERENCE_KEY);
+        mActivity = activity;
+        mFragment = fragment;
+        mMetricsFeatureProvider =
+                FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        mHandler.removeCallbacksAndMessages(/*token=*/ null);
+        mPreferenceCache.clear();
+        mAppListPreferenceGroup.removeAll();
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public boolean isSliceable() {
+        return false;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (!(preference instanceof PowerGaugePreference)) {
+            return false;
+        }
+        final PowerGaugePreference powerPref = (PowerGaugePreference) preference;
+        final BatteryDiffEntry diffEntry = powerPref.getBatteryDiffEntry();
+        final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
+        final String packageName = histEntry.mPackageName;
+        final boolean isAppEntry = histEntry.isAppEntry();
+        mMetricsFeatureProvider.action(
+                /* attribution */ SettingsEnums.OPEN_BATTERY_USAGE,
+                /* action */ isAppEntry
+                        ? SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM
+                        : SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
+                /* pageId */ SettingsEnums.OPEN_BATTERY_USAGE,
+                TextUtils.isEmpty(packageName) ? PACKAGE_NAME_NONE : packageName,
+                (int) Math.round(diffEntry.getPercentOfTotal()));
+        Log.d(TAG, String.format("handleClick() label=%s key=%s package=%s",
+                diffEntry.getAppLabel(), histEntry.getKey(), histEntry.mPackageName));
+        AdvancedPowerUsageDetail.startBatteryDetailPage(
+                mActivity, mFragment, diffEntry, powerPref.getPercent(), mSlotTimestamp);
+        return true;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPrefContext = screen.getContext();
+        mRootPreference = screen.findPreference(ROOT_PREFERENCE_KEY);
+        mTabPreference = screen.findPreference(TAB_PREFERENCE_KEY);
+        mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY);
+        mFooterPreference = screen.findPreference(FOOTER_PREFERENCE_KEY);
+
+        mAppListPreferenceGroup.setOrderingAsAdded(false);
+        mTabPreference.initializeTabs(mFragment, new String[]{
+                mPrefContext.getString(R.string.battery_usage_app_tab),
+                mPrefContext.getString(R.string.battery_usage_system_tab)
+        });
+        mTabPreference.setOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+            @Override
+            public void onPageSelected(int position) {
+                super.onPageSelected(position);
+                mTabPosition = position;
+                mHandler.post(() -> {
+                    removeAndCacheAllPreferences();
+                    addAllPreferences();
+                });
+            }
+        });
+    }
+
+    /**
+     * Updates UI when the battery usage is updated.
+     * @param slotUsageData The battery usage diff data for the selected slot. This is used in
+     *                      the app list.
+     * @param slotTimestamp The selected slot timestamp information. This is used in the battery
+     *                      usage breakdown category.
+     * @param isAllUsageDataEmpty Whether all the battery usage data is null or empty. This is
+     *                            used when showing the footer.
+     */
+    void handleBatteryUsageUpdated(
+            BatteryDiffData slotUsageData, String slotTimestamp, boolean isAllUsageDataEmpty) {
+        mBatteryDiffData = slotUsageData;
+        mSlotTimestamp = slotTimestamp;
+
+        showCategoryTitle(slotTimestamp);
+        showTabAndAppList();
+        showFooterPreference(isAllUsageDataEmpty);
+    }
+
+    // TODO: request accessibility focus on category title when slot selection updated.
+    private void showCategoryTitle(String slotTimestamp) {
+        mRootPreference.setTitle(slotTimestamp == null
+                ? mPrefContext.getString(
+                        R.string.battery_usage_breakdown_title_since_last_full_charge)
+                : mPrefContext.getString(
+                        R.string.battery_usage_breakdown_title_for_slot, slotTimestamp));
+        mRootPreference.setVisible(true);
+    }
+
+    private void showFooterPreference(boolean isAllBatteryUsageEmpty) {
+        mFooterPreference.setTitle(mPrefContext.getString(
+                isAllBatteryUsageEmpty
+                        ? R.string.battery_usage_screen_footer_empty
+                        : R.string.battery_usage_screen_footer));
+        mFooterPreference.setVisible(true);
+    }
+
+    private void showTabAndAppList() {
+        removeAndCacheAllPreferences();
+        if (mBatteryDiffData == null) {
+            return;
+        }
+        mTabPreference.setVisible(true);
+        mAppListPreferenceGroup.setVisible(true);
+        mHandler.post(() -> {
+            addAllPreferences();
+        });
+    }
+
+    @VisibleForTesting
+    void addAllPreferences() {
+        if (mBatteryDiffData == null) {
+            return;
+        }
+        final long start = System.currentTimeMillis();
+        final List<BatteryDiffEntry> entries = mTabPosition == 0
+                ? mBatteryDiffData.getAppDiffEntryList()
+                : mBatteryDiffData.getSystemDiffEntryList();
+        int prefIndex = mAppListPreferenceGroup.getPreferenceCount();
+        for (BatteryDiffEntry entry : entries) {
+            boolean isAdded = false;
+            final String appLabel = entry.getAppLabel();
+            final Drawable appIcon = entry.getAppIcon();
+            if (TextUtils.isEmpty(appLabel) || appIcon == null) {
+                Log.w(TAG, "cannot find app resource for:" + entry.getPackageName());
+                continue;
+            }
+            final String prefKey = entry.mBatteryHistEntry.getKey();
+            PowerGaugePreference pref = mAppListPreferenceGroup.findPreference(prefKey);
+            if (pref != null) {
+                isAdded = true;
+                Log.w(TAG, "preference should be removed for:" + entry.getPackageName());
+            } else {
+                pref = (PowerGaugePreference) mPreferenceCache.get(prefKey);
+            }
+            // Creates new innstance if cached preference is not found.
+            if (pref == null) {
+                pref = new PowerGaugePreference(mPrefContext);
+                pref.setKey(prefKey);
+                mPreferenceCache.put(prefKey, pref);
+            }
+            pref.setIcon(appIcon);
+            pref.setTitle(appLabel);
+            pref.setOrder(prefIndex);
+            pref.setPercent(entry.getPercentOfTotal());
+            pref.setSingleLineTitle(true);
+            // Sets the BatteryDiffEntry to preference for launching detailed page.
+            pref.setBatteryDiffEntry(entry);
+            pref.setEnabled(entry.validForRestriction());
+            setPreferenceSummary(pref, entry);
+            if (!isAdded) {
+                mAppListPreferenceGroup.addPreference(pref);
+            }
+            appIcon.setAlpha(pref.isEnabled() ? ENABLED_ICON_ALPHA : DISABLED_ICON_ALPHA);
+            prefIndex++;
+        }
+        Log.d(TAG, String.format("addAllPreferences() is finished in %d/ms",
+                (System.currentTimeMillis() - start)));
+    }
+
+    @VisibleForTesting
+    void removeAndCacheAllPreferences() {
+        final int prefsCount = mAppListPreferenceGroup.getPreferenceCount();
+        for (int index = 0; index < prefsCount; index++) {
+            final Preference pref = mAppListPreferenceGroup.getPreference(index);
+            if (TextUtils.isEmpty(pref.getKey())) {
+                continue;
+            }
+            mPreferenceCache.put(pref.getKey(), pref);
+        }
+        mAppListPreferenceGroup.removeAll();
+    }
+
+    @VisibleForTesting
+    void setPreferenceSummary(
+            PowerGaugePreference preference, BatteryDiffEntry entry) {
+        final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
+        final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
+        final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
+        String usageTimeSummary = null;
+        // Not shows summary for some system components without usage time.
+        if (totalUsageTimeInMs == 0) {
+            preference.setSummary(null);
+            // Shows background summary only if we don't have foreground usage time.
+        } else if (foregroundUsageTimeInMs == 0 && backgroundUsageTimeInMs != 0) {
+            usageTimeSummary = buildUsageTimeInfo(backgroundUsageTimeInMs, true);
+            // Shows total usage summary only if total usage time is small.
+        } else if (totalUsageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
+            usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
+        } else {
+            usageTimeSummary = buildUsageTimeInfo(totalUsageTimeInMs, false);
+            // Shows background usage time if it is larger than a minute.
+            if (backgroundUsageTimeInMs > 0) {
+                usageTimeSummary +=
+                        "\n" + buildUsageTimeInfo(backgroundUsageTimeInMs, true);
+            }
+        }
+        preference.setSummary(usageTimeSummary);
+    }
+
+    private String buildUsageTimeInfo(long usageTimeInMs, boolean isBackground) {
+        if (usageTimeInMs < DateUtils.MINUTE_IN_MILLIS) {
+            return mPrefContext.getString(
+                    isBackground
+                            ? R.string.battery_usage_background_less_than_one_minute
+                            : R.string.battery_usage_total_less_than_one_minute);
+        }
+        final CharSequence timeSequence =
+                StringUtil.formatElapsedTime(mPrefContext, (double) usageTimeInMs,
+                        /*withSeconds=*/ false, /*collapseTimeUnit=*/ false);
+        final int resourceId =
+                isBackground
+                        ? R.string.battery_usage_for_background_time
+                        : R.string.battery_usage_for_total_time;
+        return mPrefContext.getString(resourceId, timeSequence);
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index 0c7b4ab..c5c0522 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -219,7 +219,6 @@
                     .setPercentOfTotal(entry.mPercent)
                     .setDrainType(entry.getPowerComponentId())
                     .setForegroundUsageTimeInMs(entry.getTimeInForegroundMs())
-                    .setForegroundServiceUsageTimeInMs(entry.getTimeInForegroundServiceMs())
                     .setBackgroundUsageTimeInMs(entry.getTimeInBackgroundMs());
         }
 
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index 0a4ac7c..2827818 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -479,7 +479,6 @@
                 final BatteryDiffEntry currentBatteryDiffEntry = new BatteryDiffEntry(
                         context,
                         entry.mForegroundUsageTimeInMs,
-                        entry.mForegroundServiceUsageTimeInMs,
                         entry.mBackgroundUsageTimeInMs,
                         entry.mConsumePower,
                         entry.mForegroundUsageConsumePower,
@@ -573,12 +572,10 @@
         return batteryEntryList.stream()
                 .filter(entry -> {
                     final long foregroundMs = entry.getTimeInForegroundMs();
-                    final long foregroundServiceMs = entry.getTimeInForegroundServiceMs();
                     final long backgroundMs = entry.getTimeInBackgroundMs();
                     return entry.getConsumedPower() > 0
                             || (entry.getConsumedPower() == 0
-                            && (foregroundMs != 0 || foregroundServiceMs != 0
-                            || backgroundMs != 0));
+                            && (foregroundMs != 0 || backgroundMs != 0));
                 })
                 .map(entry -> ConvertUtils.convertToBatteryHistEntry(
                                 entry,
@@ -699,14 +696,9 @@
             if (lowerEntry != null) {
                 final boolean invalidForegroundUsageTime =
                         lowerEntry.mForegroundUsageTimeInMs > upperEntry.mForegroundUsageTimeInMs;
-                final boolean invalidForegroundServiceUsageTime =
-                        lowerEntry.mForegroundServiceUsageTimeInMs
-                                > upperEntry.mForegroundServiceUsageTimeInMs;
                 final boolean invalidBackgroundUsageTime =
                         lowerEntry.mBackgroundUsageTimeInMs > upperEntry.mBackgroundUsageTimeInMs;
-                if (invalidForegroundUsageTime
-                        || invalidForegroundServiceUsageTime
-                        || invalidBackgroundUsageTime) {
+                if (invalidForegroundUsageTime || invalidBackgroundUsageTime) {
                     newHistEntryMap.put(entryKey, upperEntry);
                     log(context, "abnormal reset condition is found", currentSlot, upperEntry);
                     continue;
@@ -937,11 +929,6 @@
                             currentEntry.mForegroundUsageTimeInMs,
                             nextEntry.mForegroundUsageTimeInMs,
                             nextTwoEntry.mForegroundUsageTimeInMs);
-            long foregroundServiceUsageTimeInMs =
-                    getDiffValue(
-                            currentEntry.mForegroundServiceUsageTimeInMs,
-                            nextEntry.mForegroundServiceUsageTimeInMs,
-                            nextTwoEntry.mForegroundServiceUsageTimeInMs);
             long backgroundUsageTimeInMs =
                     getDiffValue(
                             currentEntry.mBackgroundUsageTimeInMs,
@@ -974,7 +961,6 @@
                             nextTwoEntry.mCachedUsageConsumePower);
             // Excludes entry since we don't have enough data to calculate.
             if (foregroundUsageTimeInMs == 0
-                    && foregroundServiceUsageTimeInMs == 0
                     && backgroundUsageTimeInMs == 0
                     && consumePower == 0) {
                 continue;
@@ -986,7 +972,6 @@
             }
             // Forces refine the cumulative value since it may introduce deviation error since we
             // will apply the interpolation arithmetic.
-            // TODO: update this value after the new API for foreground service is completed.
             final float totalUsageTimeInMs =
                     foregroundUsageTimeInMs + backgroundUsageTimeInMs;
             if (totalUsageTimeInMs > TOTAL_HOURLY_TIME_THRESHOLD) {
@@ -999,8 +984,6 @@
                 }
                 foregroundUsageTimeInMs =
                         Math.round(foregroundUsageTimeInMs * ratio);
-                foregroundServiceUsageTimeInMs =
-                        Math.round(foregroundServiceUsageTimeInMs * ratio);
                 backgroundUsageTimeInMs =
                         Math.round(backgroundUsageTimeInMs * ratio);
                 consumePower = consumePower * ratio;
@@ -1019,7 +1002,6 @@
                 final BatteryDiffEntry currentBatteryDiffEntry = new BatteryDiffEntry(
                         context,
                         foregroundUsageTimeInMs,
-                        foregroundServiceUsageTimeInMs,
                         backgroundUsageTimeInMs,
                         consumePower,
                         foregroundUsageConsumePower,
@@ -1105,8 +1087,6 @@
             // Sums up some field data into the existing one.
             oldBatteryDiffEntry.mForegroundUsageTimeInMs +=
                     entry.mForegroundUsageTimeInMs;
-            oldBatteryDiffEntry.mForegroundServiceUsageTimeInMs +=
-                    entry.mForegroundServiceUsageTimeInMs;
             oldBatteryDiffEntry.mBackgroundUsageTimeInMs +=
                     entry.mBackgroundUsageTimeInMs;
             oldBatteryDiffEntry.mConsumePower += entry.mConsumePower;
@@ -1404,7 +1384,6 @@
         final BatteryDiffEntry batteryDiffEntry = new BatteryDiffEntry(
                 context,
                 /*foregroundUsageTimeInMs=*/ 0,
-                /*foregroundServiceUsageTimeInMs=*/ 0,
                 /*backgroundUsageTimeInMs=*/ 0,
                 consumePower,
                 /*foregroundUsageConsumePower=*/ 0,
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
index fdcbb4a..8ff802d 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DatabaseUtils.java
@@ -165,20 +165,16 @@
             batteryEntryList.stream()
                     .filter(entry -> {
                         final long foregroundMs = entry.getTimeInForegroundMs();
-                        final long foregroundServiceMs = entry.getTimeInForegroundServiceMs();
                         final long backgroundMs = entry.getTimeInBackgroundMs();
                         if (entry.getConsumedPower() == 0
                                 && (foregroundMs != 0
-                                || foregroundServiceMs != 0
                                 || backgroundMs != 0)) {
                             Log.w(TAG, String.format(
-                                    "no consumed power but has running time for %s time=%d|%d|%d",
-                                    entry.getLabel(), foregroundMs, foregroundServiceMs,
-                                    backgroundMs));
+                                    "no consumed power but has running time for %s time=%d|%d",
+                                    entry.getLabel(), foregroundMs, backgroundMs));
                         }
                         return entry.getConsumedPower() != 0
                                 || foregroundMs != 0
-                                || foregroundServiceMs != 0
                                 || backgroundMs != 0;
                     })
                     .forEach(entry -> valuesList.add(
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ExpandDividerPreference.java b/src/com/android/settings/fuelgauge/batteryusage/ExpandDividerPreference.java
deleted file mode 100644
index 8af842b..0000000
--- a/src/com/android/settings/fuelgauge/batteryusage/ExpandDividerPreference.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.fuelgauge.batteryusage;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-
-/** A preference for expandable section divider. */
-public class ExpandDividerPreference extends Preference {
-    private static final String TAG = "ExpandDividerPreference";
-    @VisibleForTesting
-    static final String PREFERENCE_KEY = "expandable_divider";
-
-    @VisibleForTesting
-    TextView mTextView;
-    @VisibleForTesting
-    ImageView mImageView;
-    private OnExpandListener mOnExpandListener;
-
-    private boolean mIsExpanded = false;
-    private String mTitleContent = null;
-
-    /** A callback listener for expand state is changed by users. */
-    public interface OnExpandListener {
-        /** Callback function for expand state is changed by users. */
-        void onExpand(boolean isExpanded);
-    }
-
-    public ExpandDividerPreference(Context context) {
-        this(context, /*attrs=*/ null);
-    }
-
-    public ExpandDividerPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        setLayoutResource(R.layout.preference_expand_divider);
-        setKey(PREFERENCE_KEY);
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
-        super.onBindViewHolder(view);
-        mTextView = (TextView) view.findViewById(R.id.expand_title);
-        mImageView = (ImageView) view.findViewById(R.id.expand_icon);
-        refreshState();
-    }
-
-    @Override
-    public void onClick() {
-        setIsExpanded(!mIsExpanded);
-        if (mOnExpandListener != null) {
-            mOnExpandListener.onExpand(mIsExpanded);
-        }
-    }
-
-    void setTitle(final String titleContent) {
-        mTitleContent = titleContent;
-        refreshState();
-    }
-
-    void setIsExpanded(boolean isExpanded) {
-        mIsExpanded = isExpanded;
-        refreshState();
-    }
-
-    void setOnExpandListener(OnExpandListener listener) {
-        mOnExpandListener = listener;
-    }
-
-    private void refreshState() {
-        if (mImageView != null) {
-            mImageView.setImageResource(mIsExpanded
-                    ? R.drawable.ic_settings_expand_less
-                    : R.drawable.ic_settings_expand_more);
-        }
-        if (mTextView != null) {
-            mTextView.setText(mTitleContent);
-        }
-    }
-}
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
index 2dba3c2..805821f 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
@@ -50,8 +50,7 @@
 public class PowerUsageAdvanced extends PowerUsageBase {
     private static final String TAG = "AdvancedBatteryUsage";
     private static final String KEY_REFRESH_TYPE = "refresh_type";
-    private static final String KEY_BATTERY_GRAPH = "battery_graph";
-    private static final String KEY_APP_LIST = "app_list";
+    private static final String KEY_BATTERY_CHART = "battery_chart";
 
     @VisibleForTesting
     BatteryHistoryPreference mHistPref;
@@ -81,7 +80,7 @@
         super.onCreate(icicle);
         final Context context = getContext();
         refreshFeatureFlag(context);
-        mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_GRAPH);
+        mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_CHART);
         setBatteryChartPreferenceController();
     }
 
@@ -134,9 +133,17 @@
         refreshFeatureFlag(context);
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         mBatteryChartPreferenceController =
-                new BatteryChartPreferenceController(context, KEY_APP_LIST,
-                        getSettingsLifecycle(), (SettingsActivity) getActivity(), this);
+                new BatteryChartPreferenceController(
+                        context, getSettingsLifecycle(), (SettingsActivity) getActivity());
+        BatteryUsageBreakdownController batteryUsageBreakdownController =
+                new BatteryUsageBreakdownController(
+                        context, getSettingsLifecycle(), (SettingsActivity) getActivity(), this);
+
+        mBatteryChartPreferenceController.setOnBatteryUsageUpdatedListener(
+                batteryUsageBreakdownController::handleBatteryUsageUpdated);
+
         controllers.add(mBatteryChartPreferenceController);
+        controllers.add(batteryUsageBreakdownController);
         setBatteryChartPreferenceController();
         return controllers;
     }
@@ -196,8 +203,10 @@
                 public List<AbstractPreferenceController> createPreferenceControllers(
                         Context context) {
                     final List<AbstractPreferenceController> controllers = new ArrayList<>();
-                    controllers.add(new BatteryChartPreferenceController(context,
-                            KEY_APP_LIST, null /* lifecycle */, null /* activity */,
+                    controllers.add(new BatteryChartPreferenceController(
+                            context, null /* lifecycle */, null /* activity */));
+                    controllers.add(new BatteryUsageBreakdownController(
+                            context, null /* lifecycle */, null /* activity */,
                             null /* fragment */));
                     return controllers;
                 }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/TabPreference.java b/src/com/android/settings/fuelgauge/batteryusage/TabPreference.java
new file mode 100644
index 0000000..517e01c
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/batteryusage/TabPreference.java
@@ -0,0 +1,152 @@
+/*
+ * 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.fuelgauge.batteryusage;
+
+import android.content.Context;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+import androidx.viewpager2.widget.ViewPager2;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
+
+/** A preference which contains a tab selection. */
+public class TabPreference extends Preference {
+    private static final String TAG = "TabPreference";
+
+    private Fragment mRootFragment;
+    private ViewPager2 mViewPager;
+    private ViewPager2.OnPageChangeCallback mOnPageChangeCallback;
+
+    @VisibleForTesting
+    String[] mTabTitles;
+    @VisibleForTesting
+    int mSavedTabPosition;
+    @VisibleForTesting
+    TabLayout mTabLayout;
+
+    public TabPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setLayoutResource(R.layout.preference_tab);
+    }
+
+    void initializeTabs(Fragment rootFragment, String[] tabTitles) {
+        mRootFragment = rootFragment;
+        mTabTitles = tabTitles;
+    }
+
+    void setOnPageChangeCallback(ViewPager2.OnPageChangeCallback callback) {
+        mOnPageChangeCallback = callback;
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+        if (mViewPager != null && mTabLayout != null) {
+            return;
+        }
+
+        mViewPager = (ViewPager2) view.findViewById(R.id.view_pager);
+        mViewPager.setAdapter(new FragmentAdapter(mRootFragment, mTabTitles.length));
+        mViewPager.setUserInputEnabled(false);
+        if (mOnPageChangeCallback != null) {
+            mViewPager.registerOnPageChangeCallback(mOnPageChangeCallback);
+        }
+
+        mTabLayout = (TabLayout) view.findViewById(R.id.tabs);
+        new TabLayoutMediator(
+                mTabLayout, mViewPager, /* autoRefresh= */ true, /* smoothScroll= */ false,
+                (tab, position) -> tab.setText(mTabTitles[position])).attach();
+        mTabLayout.getTabAt(mSavedTabPosition).select();
+    }
+
+    @Override
+    public void onDetached() {
+        super.onDetached();
+        if (mOnPageChangeCallback != null) {
+            mViewPager.unregisterOnPageChangeCallback(mOnPageChangeCallback);
+        }
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        Log.d(TAG, "onSaveInstanceState() tabPosition=" + mTabLayout.getSelectedTabPosition());
+        return new SavedState(super.onSaveInstanceState(), mTabLayout.getSelectedTabPosition());
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        if (state == null || !state.getClass().equals(SavedState.class)) {
+            super.onRestoreInstanceState(state);
+            return;
+        }
+        SavedState savedState = (SavedState) state;
+        super.onRestoreInstanceState(savedState.getSuperState());
+        mSavedTabPosition = savedState.getTabPosition();
+        Log.d(TAG, "onRestoreInstanceState() tabPosition=" + savedState.getTabPosition());
+    }
+
+    @VisibleForTesting
+    static class SavedState extends BaseSavedState {
+        private int mTabPosition;
+
+        SavedState(Parcelable superState, int tabPosition) {
+            super(superState);
+            mTabPosition = tabPosition;
+        }
+
+        int getTabPosition() {
+            return mTabPosition;
+        }
+    }
+
+    private static class FragmentAdapter extends FragmentStateAdapter {
+        private final int mItemCount;
+        private final Fragment[] mItemFragments;
+
+        FragmentAdapter(@NonNull Fragment rootFragment, int itemCount) {
+            super(rootFragment);
+            mItemCount = itemCount;
+            mItemFragments = new Fragment[mItemCount];
+            for (int i = 0; i < mItemCount; i++) {
+                // Empty tab pages.
+                mItemFragments[i] = new Fragment();
+            }
+        }
+
+        @NonNull
+        @Override
+        public Fragment createFragment(int position) {
+            return mItemFragments[position];
+        }
+
+        @Override
+        public int getItemCount() {
+            return mItemCount;
+        }
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto b/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto
index 813344b..b9b05a3 100644
--- a/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto
+++ b/src/com/android/settings/fuelgauge/protos/fuelgauge_usage_state.proto
@@ -31,10 +31,9 @@
   optional double percent_of_total = 12;
   optional int32 drain_type = 13;
   optional int64 foreground_usage_time_in_ms = 14;
-  optional int64 foreground_service_usage_time_in_ms = 15;
-  optional int64 background_usage_time_in_ms = 16;
-  optional double foreground_usage_consume_power = 17;
-  optional double foreground_service_usage_consume_power = 18;
-  optional double background_usage_consume_power = 19;
-  optional double cached_usage_consume_power = 20;
+  optional int64 background_usage_time_in_ms = 15;
+  optional double foreground_usage_consume_power = 16;
+  optional double foreground_service_usage_consume_power = 17;
+  optional double background_usage_consume_power = 18;
+  optional double cached_usage_consume_power = 19;
 }
\ No newline at end of file
diff --git a/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java b/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java
index ecbcb30..0ea9ffb 100644
--- a/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java
+++ b/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.location;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.Bundle;
 import android.provider.DeviceConfig;
@@ -24,7 +25,6 @@
 import android.view.MenuItem;
 
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -47,7 +47,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return MetricsEvent.RECENT_LOCATION_REQUESTS_ALL;
+        return SettingsEnums.LOCATION_RECENT_ACCESS_ALL;
     }
 
     @Override
diff --git a/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java b/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java
deleted file mode 100644
index 7fd6643..0000000
--- a/src/com/android/settings/location/RecentLocationRequestSeeAllFragment.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2018 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.location;
-
-import android.content.Context;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
-
-/** @deprecated Use {@link RecentLocationAccessSeeAllFragment} instead. */
-@Deprecated
-public class RecentLocationRequestSeeAllFragment extends DashboardFragment {
-    private static final String TAG = "RecentLocationReqAll";
-    public static final String PATH =
-            "com.android.settings.location.RecentLocationRequestSeeAllFragment";
-
-    private static final int MENU_SHOW_SYSTEM = Menu.FIRST + 1;
-    private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 2;
-
-    private boolean mShowSystem = false;
-    private MenuItem mShowSystemMenu;
-    private MenuItem mHideSystemMenu;
-    private RecentLocationRequestSeeAllPreferenceController mController;
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.RECENT_LOCATION_REQUESTS_ALL;
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        final int profileType = getArguments().getInt(ProfileSelectFragment.EXTRA_PROFILE);
-
-        mController = use(RecentLocationRequestSeeAllPreferenceController.class);
-        mController.init(this);
-        if (profileType != 0) {
-            mController.setProfileType(profileType);
-        }
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.location_recent_requests_see_all;
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem menuItem) {
-        switch (menuItem.getItemId()) {
-            case MENU_SHOW_SYSTEM:
-            case MENU_HIDE_SYSTEM:
-                mShowSystem = menuItem.getItemId() == MENU_SHOW_SYSTEM;
-                updateMenu();
-                if (mController != null) {
-                    mController.setShowSystem(mShowSystem);
-                }
-                return true;
-            default:
-                return super.onOptionsItemSelected(menuItem);
-        }
-    }
-
-    private void updateMenu() {
-        mShowSystemMenu.setVisible(!mShowSystem);
-        mHideSystemMenu.setVisible(mShowSystem);
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        super.onCreateOptionsMenu(menu, inflater);
-        mShowSystemMenu = menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE,
-                R.string.menu_show_system);
-        mHideSystemMenu = menu.add(Menu.NONE, MENU_HIDE_SYSTEM, Menu.NONE,
-                R.string.menu_hide_system);
-        updateMenu();
-    }
-}
diff --git a/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java b/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java
index 772db45..ab80f6a 100644
--- a/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java
+++ b/src/com/android/settings/network/NetworkProviderCallsSmsFragment.java
@@ -84,7 +84,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return SettingsEnums.ACTION_UNKNOWN;
+        return SettingsEnums.NETWORK_PROVIDER_CALLS_SMS;
     }
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/notification/MediaVolumePreferenceController.java b/src/com/android/settings/notification/MediaVolumePreferenceController.java
index 0ddba08..8c5cf21 100644
--- a/src/com/android/settings/notification/MediaVolumePreferenceController.java
+++ b/src/com/android/settings/notification/MediaVolumePreferenceController.java
@@ -93,7 +93,8 @@
 
     @VisibleForTesting
     boolean isSupportEndItem() {
-        return getWorker() != null && getWorker().isBroadcastSupported() && isConnectedBLEDevice();
+        return getWorker() != null && getWorker().isBroadcastSupported()
+                && (getWorker().isDeviceBroadcasting() || isConnectedBLEDevice());
     }
 
     private boolean isConnectedBLEDevice() {
diff --git a/src/com/android/settings/security/MemtagHelper.java b/src/com/android/settings/security/MemtagHelper.java
index c891eb2..b3e24e4 100644
--- a/src/com/android/settings/security/MemtagHelper.java
+++ b/src/com/android/settings/security/MemtagHelper.java
@@ -32,6 +32,13 @@
                                 "persist.device_config.memory_safety_native.bootloader_override"));
     }
 
+    private static boolean isForcedOn() {
+        return "force_on"
+                .equals(
+                        SystemProperties.get(
+                                "persist.device_config.memory_safety_native.bootloader_override"));
+    }
+
     public static boolean isChecked() {
         String modes[] = SystemProperties.get("arm64.memtag.bootctl", "").split(",");
         return Arrays.asList(modes).contains("memtag");
@@ -43,7 +50,7 @@
     }
 
     public static int getAvailabilityStatus() {
-        if (MemtagHelper.isForcedOff()) {
+        if (MemtagHelper.isForcedOff() || MemtagHelper.isForcedOn()) {
             return BasePreferenceController.DISABLED_DEPENDENT_SETTING;
         }
         return SystemProperties.getBoolean("ro.arm64.memtag.bootctl_settings_toggle", false)
@@ -65,6 +72,9 @@
         if (isForcedOff()) {
             return R.string.memtag_force_off;
         }
+        if (isForcedOn()) {
+            return R.string.memtag_force_on;
+        }
         if (isOn()) {
             if (isChecked()) {
                 return R.string.memtag_on;
diff --git a/src/com/android/settings/spa/app/AllAppList.kt b/src/com/android/settings/spa/app/AllAppList.kt
index 75b5cd2..cd116c1 100644
--- a/src/com/android/settings/spa/app/AllAppList.kt
+++ b/src/com/android/settings/spa/app/AllAppList.kt
@@ -19,6 +19,7 @@
 import android.content.pm.ApplicationInfo
 import android.os.Bundle
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.State
 import androidx.compose.runtime.remember
 import androidx.compose.ui.res.stringResource
 import com.android.settings.R
@@ -32,6 +33,8 @@
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spaprivileged.model.app.AppListModel
 import com.android.settingslib.spaprivileged.model.app.AppRecord
+import com.android.settingslib.spaprivileged.template.app.AppList
+import com.android.settingslib.spaprivileged.template.app.AppListInput
 import com.android.settingslib.spaprivileged.template.app.AppListItem
 import com.android.settingslib.spaprivileged.template.app.AppListPage
 import com.android.settingslib.spaprivileged.template.app.getStorageSize
@@ -57,17 +60,18 @@
 }
 
 @Composable
-private fun AllAppListPage() {
+fun AllAppListPage(
+    appList: @Composable AppListInput<AppRecordWithSize>.() -> Unit = { AppList() },
+) {
     val resetAppDialogPresenter = rememberResetAppDialogPresenter()
     AppListPage(
         title = stringResource(R.string.all_apps),
         listModel = remember { AllAppListModel() },
         showInstantApps = true,
-        moreOptions = { ResetAppPreferences(resetAppDialogPresenter::open) }
+        moreOptions = { ResetAppPreferences(resetAppDialogPresenter::open) },
+        appList = appList,
     ) {
-        AppListItem(
-            onClick = AppInfoSettingsProvider.navigator(app = record.app),
-        )
+        AppListItem(onClick = AppInfoSettingsProvider.navigator(app = record.app))
     }
 }
 
@@ -75,11 +79,13 @@
     override val app: ApplicationInfo,
 ) : AppRecord
 
-private class AllAppListModel : AppListModel<AppRecordWithSize> {
+class AllAppListModel(
+    private val getSummary: @Composable ApplicationInfo.() -> State<String> = { getStorageSize() },
+) : AppListModel<AppRecordWithSize> {
 
     override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) =
         appListFlow.mapItem(::AppRecordWithSize)
 
     @Composable
-    override fun getSummary(option: Int, record: AppRecordWithSize) = record.app.getStorageSize()
+    override fun getSummary(option: Int, record: AppRecordWithSize) = record.app.getSummary()
 }
diff --git a/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt b/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt
index 20e8aca..29c7483 100644
--- a/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppAllServicesPreference.kt
@@ -28,8 +28,9 @@
 import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settings.R
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spaprivileged.model.app.resolveActionForApp
@@ -45,6 +46,7 @@
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.plus
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun AppAllServicesPreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt b/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt
index 328f8a5..8b90280 100644
--- a/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppDataUsagePreference.kt
@@ -27,6 +27,8 @@
 import androidx.compose.runtime.remember
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settings.R
 import com.android.settings.Utils
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment
@@ -34,7 +36,6 @@
 import com.android.settings.datausage.DataUsageUtils
 import com.android.settingslib.net.NetworkCycleDataForUid
 import com.android.settingslib.net.NetworkCycleDataForUidLoader
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.framework.compose.toState
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
@@ -43,6 +44,7 @@
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.withContext
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun AppDataUsagePreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt b/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt
index 8d9c98a..b89d768 100644
--- a/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppInstallerInfoPreference.kt
@@ -27,7 +27,8 @@
 import com.android.settings.Utils
 import com.android.settings.applications.AppStoreUtil
 import com.android.settingslib.applications.AppUtils
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spaprivileged.framework.common.asUser
@@ -44,6 +45,7 @@
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun AppInstallerInfoPreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt b/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt
index b9607b0..e95c5a1 100644
--- a/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppLocalePreference.kt
@@ -31,7 +31,8 @@
 import com.android.settings.applications.AppLocaleUtil
 import com.android.settings.applications.appinfo.AppLocaleDetails
 import com.android.settings.localepicker.AppLocalePickerActivity
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spaprivileged.model.app.userHandle
@@ -40,6 +41,7 @@
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.withContext
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun AppLocalePreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt b/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt
index ee0212a..d700641 100644
--- a/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/AppSettingsPreference.kt
@@ -28,7 +28,8 @@
 import androidx.compose.ui.res.stringResource
 import com.android.settings.R
 import com.android.settings.overlay.FeatureFactory
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spaprivileged.model.app.resolveActionForApp
@@ -43,6 +44,7 @@
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.plus
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun AppSettingsPreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
index a38901e..d981067 100644
--- a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt
@@ -35,7 +35,8 @@
 import com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED
 import com.android.settings.Utils.PROPERTY_HIBERNATION_TARGETS_PRE_S_APPS
 import com.android.settingslib.spa.framework.compose.OverridableFlow
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.framework.compose.stateOf
 import com.android.settingslib.spa.widget.preference.SwitchPreference
 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
@@ -51,6 +52,7 @@
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun HibernationSwitchPreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt b/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt
index 3a7d50d..0e93b56 100644
--- a/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/InstantAppDomainsPreference.kt
@@ -34,7 +34,8 @@
 import androidx.compose.ui.res.stringResource
 import com.android.settings.R
 import com.android.settings.Utils
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.framework.theme.SettingsDimension
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
@@ -45,6 +46,7 @@
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun InstantAppDomainsPreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt b/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt
index 15d0501..2430e73 100644
--- a/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt
+++ b/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreference.kt
@@ -25,7 +25,8 @@
 import com.android.settings.R
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment
 import com.android.settings.applications.specialaccess.interactacrossprofiles.InteractAcrossProfilesDetails
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settingslib.spa.widget.preference.Preference
 import com.android.settingslib.spa.widget.preference.PreferenceModel
 import com.android.settingslib.spaprivileged.framework.common.crossProfileApps
@@ -33,6 +34,7 @@
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.flowOn
 
+@OptIn(ExperimentalLifecycleComposeApi::class)
 @Composable
 fun InteractAcrossProfilesDetailsPreference(app: ApplicationInfo) {
     val context = LocalContext.current
diff --git a/src/com/android/settings/spa/system/AppLanguagesListModel.kt b/src/com/android/settings/spa/system/AppLanguagesListModel.kt
index 50b23d3..eea72f2 100644
--- a/src/com/android/settings/spa/system/AppLanguagesListModel.kt
+++ b/src/com/android/settings/spa/system/AppLanguagesListModel.kt
@@ -23,16 +23,13 @@
 import androidx.compose.runtime.State
 import androidx.compose.runtime.remember
 import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.android.settings.R
 import com.android.settings.applications.AppLocaleUtil
 import com.android.settings.applications.appinfo.AppLocaleDetails
-import com.android.settingslib.applications.ApplicationsState
-import com.android.settingslib.applications.ApplicationsState.AppEntry
-import com.android.settingslib.spa.framework.compose.collectAsStateWithLifecycle
-import com.android.settingslib.spa.framework.util.asyncMapItem
 import com.android.settingslib.spaprivileged.model.app.AppListModel
 import com.android.settingslib.spaprivileged.model.app.AppRecord
-import com.android.settingslib.spaprivileged.model.app.userId
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.flow
@@ -70,6 +67,7 @@
         recordList.filter { it.isAppLocaleSupported }
     }
 
+    @OptIn(ExperimentalLifecycleComposeApi::class)
     @Composable
     override fun getSummary(option: Int, record: AppLanguagesRecord): State<String>? =
         remember(record.app) {
diff --git a/tests/robotests/assets/exempt_not_implementing_index_provider b/tests/robotests/assets/exempt_not_implementing_index_provider
index 6a1a1ff..7099089 100644
--- a/tests/robotests/assets/exempt_not_implementing_index_provider
+++ b/tests/robotests/assets/exempt_not_implementing_index_provider
@@ -92,4 +92,3 @@
 com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessDetails
 com.android.settings.wifi.details2.WifiNetworkDetailsFragment2
 com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsWifiSettings2
-com.android.settings.dashboard.profileselector.ProfileSelectRecentLocationRequestFragment
diff --git a/tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java
index 8597d64..4ad5c22 100644
--- a/tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/CustomizableLockScreenQuickAffordancesPreferenceControllerTest.java
@@ -102,6 +102,8 @@
         assertThat(intentCaptor.getValue().getPackage()).isEqualTo(
                 mContext.getString(R.string.config_wallpaper_picker_package));
         assertThat(intentCaptor.getValue().getAction()).isEqualTo(Intent.ACTION_SET_WALLPAPER);
+        assertThat(intentCaptor.getValue().getStringExtra("destination"))
+                .isEqualTo("quick_affordances");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
index 284dbe3..15b7e02 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java
@@ -68,6 +68,7 @@
     private static final String STATUS_CHARGING_TIME = "50% - 0 min left until full";
     private static final String STATUS_NOT_CHARGING = "Not charging";
     private static final String STATUS_CHARGING_FUTURE_BYPASS = "50% - Charging to 12%";
+    private static final String STATUS_CHARGING_PAUSED = "50% - Charging paused";
     private static final long REMAINING_TIME_NULL = -1;
     private static final long REMAINING_TIME = 2;
     // Strings are defined in frameworks/base/packages/SettingsLib/res/values/strings.xml
@@ -256,8 +257,6 @@
 
     @Test
     public void testGetBatteryInfo_chargingWithOverheated_updateChargeLabel() {
-        final String expectedString =
-                mContext.getString(R.string.battery_tip_limited_temporarily_title);
         doReturn(TEST_CHARGE_TIME_REMAINING)
                 .when(mBatteryUsageStats)
                 .getChargeTimeRemainingMs();
@@ -269,13 +268,11 @@
                 false /* shortString */);
 
         assertThat(info.isOverheated).isTrue();
-        assertThat(info.chargeLabel.toString()).contains(expectedString);
+        assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_PAUSED);
     }
 
     @Test
     public void testGetBatteryInfo_dockDefenderActive_updateChargeString() {
-        final String expectedString =
-                mContext.getString(R.string.battery_tip_limited_temporarily_title);
         doReturn(TEST_CHARGE_TIME_REMAINING / 1000)
                 .when(mBatteryUsageStats).getChargeTimeRemainingMs();
         doReturn(true).when(mFeatureFactory.powerUsageFeatureProvider).isExtraDefend();
@@ -289,7 +286,7 @@
                 mBatteryUsageStats, MOCK_ESTIMATE, SystemClock.elapsedRealtime() * 1000,
                 false /* shortString */);
 
-        assertThat(info.chargeLabel.toString()).contains(expectedString);
+        assertThat(info.chargeLabel.toString()).contains(STATUS_CHARGING_PAUSED);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
index 5c84997..42eb1c0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
@@ -24,16 +24,13 @@
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
-import android.app.settings.SettingsEnums;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.LocaleList;
 import android.text.format.DateUtils;
@@ -41,27 +38,17 @@
 import android.view.ViewPropertyAnimator;
 import android.widget.LinearLayout;
 
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceGroup;
-
 import com.android.settings.SettingsActivity;
-import com.android.settings.core.InstrumentedPreferenceFragment;
-import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -70,18 +57,9 @@
 
 @RunWith(RobolectricTestRunner.class)
 public final class BatteryChartPreferenceControllerTest {
-    private static final String PREF_KEY = "pref_key";
-    private static final String PREF_SUMMARY = "fake preference summary";
-
-    @Mock
-    private InstrumentedPreferenceFragment mFragment;
     @Mock
     private SettingsActivity mSettingsActivity;
     @Mock
-    private PreferenceGroup mAppListGroup;
-    @Mock
-    private Drawable mDrawable;
-    @Mock
     private BatteryHistEntry mBatteryHistEntry;
     @Mock
     private BatteryChartView mDailyChartView;
@@ -90,16 +68,11 @@
     @Mock
     private ViewPropertyAnimator mViewPropertyAnimator;
     @Mock
-    private PowerGaugePreference mPowerGaugePreference;
-    @Mock
-    private BatteryUtils mBatteryUtils;
-    @Mock
     private LinearLayout.LayoutParams mLayoutParams;
 
     private Context mContext;
     private FakeFeatureFactory mFeatureFactory;
     private BatteryDiffEntry mBatteryDiffEntry;
-    private MetricsFeatureProvider mMetricsFeatureProvider;
     private BatteryChartPreferenceController mBatteryChartPreferenceController;
 
     @Before
@@ -109,7 +82,6 @@
         org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false);
         TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
         mFeatureFactory = FakeFeatureFactory.setupForTest();
-        mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
         mContext = spy(RuntimeEnvironment.application);
         final Resources resources = spy(mContext.getResources());
         resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
@@ -121,13 +93,11 @@
         setupHourlyChartViewAnimationMock();
         mBatteryChartPreferenceController = createController();
         mBatteryChartPreferenceController.mPrefContext = mContext;
-        mBatteryChartPreferenceController.mAppListPrefGroup = mAppListGroup;
         mBatteryChartPreferenceController.mDailyChartView = mDailyChartView;
         mBatteryChartPreferenceController.mHourlyChartView = mHourlyChartView;
         mBatteryDiffEntry = new BatteryDiffEntry(
                 mContext,
                 /*foregroundUsageTimeInMs=*/ 1,
-                /*foregroundServiceUsageTimeInMs=*/ 3,
                 /*backgroundUsageTimeInMs=*/ 2,
                 /*consumePower=*/ 3,
                 /*foregroundUsageConsumePower=*/ 0,
@@ -163,24 +133,6 @@
     }
 
     @Test
-    public void onDestroy_clearPreferenceCache() {
-        // Ensures the testing environment is correct.
-        mBatteryChartPreferenceController.mPreferenceCache.put(
-                PREF_KEY, mPowerGaugePreference);
-        assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1);
-
-        mBatteryChartPreferenceController.onDestroy();
-        // Verifies the result after onDestroy.
-        assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
-    }
-
-    @Test
-    public void onDestroy_removeAllPreferenceFromPreferenceGroup() {
-        mBatteryChartPreferenceController.onDestroy();
-        verify(mAppListGroup).removeAll();
-    }
-
-    @Test
     public void setBatteryChartViewModel_6Hours() {
         reset(mDailyChartView);
         reset(mHourlyChartView);
@@ -314,9 +266,9 @@
     }
 
     @Test
-    public void refreshUi_batteryIndexedMapIsNull_ignoreRefresh() {
+    public void refreshUi_batteryIndexedMapIsNull_returnTrue() {
         mBatteryChartPreferenceController.setBatteryHistoryMap(null);
-        assertThat(mBatteryChartPreferenceController.refreshUi()).isFalse();
+        assertThat(mBatteryChartPreferenceController.refreshUi()).isTrue();
     }
 
     @Test
@@ -332,266 +284,6 @@
     }
 
     @Test
-    public void removeAndCacheAllPrefs_emptyContent_ignoreRemoveAll() {
-        mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
-        mBatteryChartPreferenceController.mBatteryUsageMap = createBatteryUsageMap();
-        doReturn(0).when(mAppListGroup).getPreferenceCount();
-
-        mBatteryChartPreferenceController.refreshUi();
-        verify(mAppListGroup, never()).removeAll();
-    }
-
-    @Test
-    public void removeAndCacheAllPrefs_buildCacheAndRemoveAllPreference() {
-        mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
-        mBatteryChartPreferenceController.mBatteryUsageMap = createBatteryUsageMap();
-        doReturn(1).when(mAppListGroup).getPreferenceCount();
-        doReturn(mPowerGaugePreference).when(mAppListGroup).getPreference(0);
-        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
-        doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
-        doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY);
-        // Ensures the testing data is correct.
-        assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
-
-        mBatteryChartPreferenceController.refreshUi();
-
-        assertThat(mBatteryChartPreferenceController.mPreferenceCache.get(PREF_KEY))
-                .isEqualTo(mPowerGaugePreference);
-        verify(mAppListGroup).removeAll();
-    }
-
-    @Test
-    public void addPreferenceToScreen_emptyContent_ignoreAddPreference() {
-        mBatteryChartPreferenceController.addPreferenceToScreen(
-                new ArrayList<BatteryDiffEntry>());
-        verify(mAppListGroup, never()).addPreference(any());
-    }
-
-    @Test
-    public void addPreferenceToScreen_addPreferenceIntoScreen() {
-        final String appLabel = "fake app label";
-        doReturn(1).when(mAppListGroup).getPreferenceCount();
-        doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
-        doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
-        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
-        doReturn(null).when(mAppListGroup).findPreference(PREF_KEY);
-        doReturn(false).when(mBatteryDiffEntry).validForRestriction();
-
-        mBatteryChartPreferenceController.addPreferenceToScreen(
-                Arrays.asList(mBatteryDiffEntry));
-
-        // Verifies the preference cache.
-        final PowerGaugePreference pref =
-                (PowerGaugePreference) mBatteryChartPreferenceController.mPreferenceCache
-                        .get(PREF_KEY);
-        assertThat(pref).isNotNull();
-        // Verifies the added preference configuration.
-        verify(mAppListGroup).addPreference(pref);
-        assertThat(pref.getKey()).isEqualTo(PREF_KEY);
-        assertThat(pref.getTitle()).isEqualTo(appLabel);
-        assertThat(pref.getIcon()).isEqualTo(mDrawable);
-        assertThat(pref.getOrder()).isEqualTo(1);
-        assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry);
-        assertThat(pref.isSingleLineTitle()).isTrue();
-        assertThat(pref.isEnabled()).isFalse();
-    }
-
-    @Test
-    public void addPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() {
-        final String appLabel = "fake app label";
-        doReturn(1).when(mAppListGroup).getPreferenceCount();
-        doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
-        doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
-        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
-        doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY);
-
-        mBatteryChartPreferenceController.addPreferenceToScreen(
-                Arrays.asList(mBatteryDiffEntry));
-
-        verify(mAppListGroup, never()).addPreference(any());
-    }
-
-    @Test
-    public void handlePreferenceTreeClick_notPowerGaugePreference_returnFalse() {
-        assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup))
-                .isFalse();
-
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM);
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM);
-    }
-
-    @Test
-    public void handlePreferenceTreeClick_forAppEntry_returnTrue() {
-        doReturn(false).when(mBatteryHistEntry).isAppEntry();
-        doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
-
-        assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(
-                mPowerGaugePreference)).isTrue();
-        verify(mMetricsFeatureProvider)
-                .action(
-                        SettingsEnums.OPEN_BATTERY_USAGE,
-                        SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
-                        SettingsEnums.OPEN_BATTERY_USAGE,
-                        /* package name */ "none",
-                        /* percentage of total */ 0);
-    }
-
-    @Test
-    public void handlePreferenceTreeClick_forSystemEntry_returnTrue() {
-        mBatteryChartPreferenceController.mBatteryUtils = mBatteryUtils;
-        doReturn(true).when(mBatteryHistEntry).isAppEntry();
-        doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
-
-        assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(
-                mPowerGaugePreference)).isTrue();
-        verify(mMetricsFeatureProvider)
-                .action(
-                        SettingsEnums.OPEN_BATTERY_USAGE,
-                        SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM,
-                        SettingsEnums.OPEN_BATTERY_USAGE,
-                        /* package name */ "none",
-                        /* percentage of total */ 0);
-    }
-
-    @Test
-    public void setPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() {
-        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
-        pref.setSummary(PREF_SUMMARY);
-
-        mBatteryChartPreferenceController.setPreferenceSummary(
-                pref, createBatteryDiffEntry(
-                        /*foregroundUsageTimeInMs=*/ 0,
-                        /*foregroundServiceUsageTimeInMs=*/ 0,
-                        /*backgroundUsageTimeInMs=*/ 0));
-        assertThat(pref.getSummary()).isNull();
-    }
-
-    @Test
-    public void setPreferenceSummary_setBackgroundUsageTimeOnly() {
-        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
-        pref.setSummary(PREF_SUMMARY);
-
-        mBatteryChartPreferenceController.setPreferenceSummary(
-                pref, createBatteryDiffEntry(
-                        /*foregroundUsageTimeInMs=*/ 0,
-                        /*foregroundServiceUsageTimeInMs=*/ 0,
-                        /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
-        assertThat(pref.getSummary()).isEqualTo("Background: 1 min");
-    }
-
-    @Test
-    public void setPreferenceSummary_setTotalUsageTimeLessThanAMinute() {
-        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
-        pref.setSummary(PREF_SUMMARY);
-
-        mBatteryChartPreferenceController.setPreferenceSummary(
-                pref, createBatteryDiffEntry(
-                        /*foregroundUsageTimeInMs=*/ 100,
-                        /*foregroundServiceUsageTimeInMs=*/ 200,
-                        /*backgroundUsageTimeInMs=*/ 200));
-        assertThat(pref.getSummary()).isEqualTo("Total: less than a min");
-    }
-
-    @Test
-    public void setPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() {
-        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
-        pref.setSummary(PREF_SUMMARY);
-
-        mBatteryChartPreferenceController.setPreferenceSummary(
-                pref, createBatteryDiffEntry(
-                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
-                        /*foregroundServiceUsageTimeInMs=*/ 100,
-                        /*backgroundUsageTimeInMs=*/ 200));
-        assertThat(pref.getSummary())
-                .isEqualTo("Total: 1 min\nBackground: less than a min");
-    }
-
-    @Test
-    public void setPreferenceSummary_setTotalAndBackgroundUsageTime() {
-        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
-        pref.setSummary(PREF_SUMMARY);
-
-        mBatteryChartPreferenceController.setPreferenceSummary(
-                pref, createBatteryDiffEntry(
-                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
-                        /*foregroundServiceUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
-                        /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
-        assertThat(pref.getSummary()).isEqualTo("Total: 2 min\nBackground: 1 min");
-    }
-
-    @Test
-    public void onExpand_expandedIsTrue_addSystemEntriesToPreferenceGroup() {
-        doReturn(1).when(mAppListGroup).getPreferenceCount();
-        mBatteryChartPreferenceController.mBatteryUsageMap = createBatteryUsageMap();
-        doReturn("label").when(mBatteryDiffEntry).getAppLabel();
-        doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
-        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
-
-        mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ true);
-
-        final ArgumentCaptor<Preference> captor = ArgumentCaptor.forClass(Preference.class);
-        verify(mAppListGroup).addPreference(captor.capture());
-        // Verifies the added preference.
-        assertThat(captor.getValue().getKey()).isEqualTo(PREF_KEY);
-        verify(mMetricsFeatureProvider)
-                .action(
-                        mContext,
-                        SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
-                        true /*isExpanded*/);
-    }
-
-    @Test
-    public void onExpand_expandedIsFalse_removeSystemEntriesFromPreferenceGroup() {
-        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
-        doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY);
-        mBatteryChartPreferenceController.mBatteryUsageMap = createBatteryUsageMap();
-        // Verifies the cache is empty first.
-        assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty();
-
-        mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ false);
-
-        verify(mAppListGroup).findPreference(PREF_KEY);
-        verify(mAppListGroup).removePreference(mPowerGaugePreference);
-        assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1);
-        verify(mMetricsFeatureProvider)
-                .action(
-                        mContext,
-                        SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM,
-                        false /*isExpanded*/);
-    }
-
-    @Test
-    public void refreshCategoryTitle_setLastFullChargeIntoBothTitleTextView() {
-        mBatteryChartPreferenceController = createController();
-        mBatteryChartPreferenceController.mAppListPrefGroup =
-                spy(new PreferenceCategory(mContext));
-        mBatteryChartPreferenceController.mExpandDividerPreference =
-                spy(new ExpandDividerPreference(mContext));
-        // Simulates select all condition.
-        mBatteryChartPreferenceController.mDailyChartIndex =
-                BatteryChartViewModel.SELECTED_INDEX_ALL;
-        mBatteryChartPreferenceController.mHourlyChartIndex =
-                BatteryChartViewModel.SELECTED_INDEX_ALL;
-
-        mBatteryChartPreferenceController.refreshCategoryTitle();
-
-        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
-        // Verifies the title in the preference group.
-        verify(mBatteryChartPreferenceController.mAppListPrefGroup)
-                .setTitle(captor.capture());
-        assertThat(captor.getValue())
-                .isEqualTo("App usage since last full charge");
-        // Verifies the title in the expandable divider.
-        captor = ArgumentCaptor.forClass(String.class);
-        verify(mBatteryChartPreferenceController.mExpandDividerPreference)
-                .setTitle(captor.capture());
-        assertThat(captor.getValue())
-                .isEqualTo("System usage since last full charge");
-    }
-
-    @Test
     public void selectedSlotText_selectAllDaysAllHours_returnNull() {
         mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60));
         mBatteryChartPreferenceController.mDailyChartIndex =
@@ -646,16 +338,13 @@
     public void onSaveInstanceState_restoreSelectedIndexAndExpandState() {
         final int expectedDailyIndex = 1;
         final int expectedHourlyIndex = 2;
-        final boolean isExpanded = true;
         final Bundle bundle = new Bundle();
         mBatteryChartPreferenceController.mDailyChartIndex = expectedDailyIndex;
         mBatteryChartPreferenceController.mHourlyChartIndex = expectedHourlyIndex;
-        mBatteryChartPreferenceController.mIsExpanded = isExpanded;
         mBatteryChartPreferenceController.onSaveInstanceState(bundle);
         // Replaces the original controller with other values.
         mBatteryChartPreferenceController.mDailyChartIndex = -1;
         mBatteryChartPreferenceController.mHourlyChartIndex = -1;
-        mBatteryChartPreferenceController.mIsExpanded = false;
 
         mBatteryChartPreferenceController.onCreate(bundle);
         mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(25));
@@ -664,7 +353,6 @@
                 .isEqualTo(expectedDailyIndex);
         assertThat(mBatteryChartPreferenceController.mHourlyChartIndex)
                 .isEqualTo(expectedHourlyIndex);
-        assertThat(mBatteryChartPreferenceController.mIsExpanded).isTrue();
     }
 
     @Test
@@ -710,37 +398,10 @@
         return batteryHistoryMap;
     }
 
-    private Map<Integer, Map<Integer, BatteryDiffData>> createBatteryUsageMap() {
-        final int selectedAll = BatteryChartViewModel.SELECTED_INDEX_ALL;
-        return Map.of(
-                selectedAll, Map.of(
-                        selectedAll, new BatteryDiffData(
-                                Arrays.asList(mBatteryDiffEntry),
-                                Arrays.asList(mBatteryDiffEntry))),
-                0, Map.of(
-                        selectedAll, new BatteryDiffData(
-                                Arrays.asList(mBatteryDiffEntry),
-                                Arrays.asList(mBatteryDiffEntry)),
-                        0, new BatteryDiffData(
-                                Arrays.asList(mBatteryDiffEntry),
-                                Arrays.asList(mBatteryDiffEntry))));
-    }
-
-    private BatteryDiffEntry createBatteryDiffEntry(
-            long foregroundUsageTimeInMs, long foregroundServiceUsageTimeInMs,
-            long backgroundUsageTimeInMs) {
-        return new BatteryDiffEntry(
-                mContext, foregroundUsageTimeInMs, foregroundServiceUsageTimeInMs,
-                backgroundUsageTimeInMs, /*consumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0,
-                /*foregroundServiceUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0,
-                /*cachedUsageConsumePower=*/ 0, mBatteryHistEntry);
-    }
-
     private BatteryChartPreferenceController createController() {
         final BatteryChartPreferenceController controller =
                 new BatteryChartPreferenceController(
-                        mContext, "app_list", /*lifecycle=*/ null,
-                        mSettingsActivity, mFragment);
+                        mContext, /*lifecycle=*/ null, mSettingsActivity);
         controller.mPrefContext = mContext;
         return controller;
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
index 0090436..f8bcbc8 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffEntryTest.java
@@ -96,7 +96,6 @@
                 new BatteryDiffEntry(
                         mContext,
                         /*foregroundUsageTimeInMs=*/ 10001L,
-                        /*foregroundServiceUsageTimeInMs=*/ 10002L,
                         /*backgroundUsageTimeInMs=*/ 20002L,
                         /*consumePower=*/ 22.0,
                         /*foregroundUsageConsumePower=*/ 10.0,
@@ -115,7 +114,6 @@
                 new BatteryDiffEntry(
                         mContext,
                         /*foregroundUsageTimeInMs=*/ 10001L,
-                        /*foregroundServiceUsageTimeInMs=*/ 10002L,
                         /*backgroundUsageTimeInMs=*/ 20002L,
                         /*consumePower=*/ 22.0,
                         /*foregroundUsageConsumePower=*/ 10.0,
@@ -493,7 +491,6 @@
         return new BatteryDiffEntry(
                 mContext,
                 /*foregroundUsageTimeInMs=*/ 0,
-                /*foregroundServiceUsageTimeInMs=*/ 0,
                 /*backgroundUsageTimeInMs=*/ 0,
                 /*consumePower=*/ 0,
                 /*foregroundUsageConsumePower=*/ 0,
@@ -508,7 +505,6 @@
         final BatteryDiffEntry entry = new BatteryDiffEntry(
                 mContext,
                 /*foregroundUsageTimeInMs=*/ 0,
-                /*foregroundServiceUsageTimeInMs=*/ 0,
                 /*backgroundUsageTimeInMs=*/ 0,
                 consumePower,
                 /*foregroundUsageConsumePower=*/ 0,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
index 848265a..5c143b1 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryHistEntryTest.java
@@ -63,7 +63,6 @@
         when(mMockBatteryEntry.getConsumedPowerInCached()).thenReturn(1.5);
         mMockBatteryEntry.mPercent = 0.3;
         when(mMockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
-        when(mMockBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(3456L);
         when(mMockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
         when(mMockBatteryEntry.getPowerComponentId()).thenReturn(expectedType);
         when(mMockBatteryEntry.getConsumerType())
@@ -104,7 +103,6 @@
                         /*backgroundUsageConsumePower=*/ 1.4,
                         /*cachedUsageConsumePower=*/ 1.5,
                         /*foregroundUsageTimeInMs=*/ 1234L,
-                        /*foregroundServiceUsageTimeInMs=*/ 3456L,
                         /*backgroundUsageTimeInMs=*/ 5689L,
                         /*batteryLevel=*/ 12),
                 /*drainType=*/ 3,
@@ -193,7 +191,6 @@
                 /*backgroundUsageConsumePower=*/ 3,
                 /*cachedUsageConsumePower=*/ 4,
                 /*foregroundUsageTimeInMs=*/ 100,
-                /*foregroundServiceUsageTimeInMs=*/ 150,
                 /*backgroundUsageTimeInMs=*/ 200,
                 /*batteryLevel=*/ 90);
         final BatteryHistEntry upperHistEntry = createBatteryHistEntry(
@@ -206,7 +203,6 @@
                 /*backgroundUsageConsumePower=*/ 6,
                 /*cachedUsageConsumePower=*/ 5,
                 /*foregroundUsageTimeInMs=*/ 200,
-                /*foregroundServiceUsageTimeInMs=*/ 250,
                 /*backgroundUsageTimeInMs=*/ 300,
                 /*batteryLevel=*/ 80);
 
@@ -229,7 +225,6 @@
                 /*backgroundUsageConsumePower=*/ 3 + 0.5 * (6 - 3),
                 /*cachedUsageConsumePower=*/ 4 + 0.5 * (5 - 4),
                 /*foregroundUsageTimeInMs=*/ Math.round(100 + 0.5 * (200 - 100)),
-                /*foregroundServiceUsageTimeInMs=*/ Math.round(150 + 0.5 * (250 - 150)),
                 /*backgroundUsageTimeInMs=*/ Math.round(200 + 0.5 * (300 - 200)),
                 /*batteryLevel=*/ (int) Math.round(90 + 0.5 * (80 - 90)));
     }
@@ -249,7 +244,6 @@
                 /*backgroundUsageConsumePower=*/ 6,
                 /*cachedUsageConsumePower=*/ 5,
                 /*foregroundUsageTimeInMs=*/ 200,
-                /*foregroundServiceUsageTimeInMs=*/ 250,
                 /*backgroundUsageTimeInMs=*/ 300,
                 /*batteryLevel=*/ 80);
 
@@ -272,7 +266,6 @@
                 /*backgroundUsageConsumePower=*/ 0.5 * 6,
                 /*cachedUsageConsumePower=*/ 0.5 * 5,
                 /*foregroundUsageTimeInMs=*/ Math.round(0.5 * 200),
-                /*foregroundServiceUsageTimeInMs=*/ Math.round(0.5 * 250),
                 /*backgroundUsageTimeInMs=*/ Math.round(0.5 * 300),
                 /*batteryLevel=*/ upperHistEntry.mBatteryLevel);
     }
@@ -301,7 +294,6 @@
                 /*backgroundUsageConsumePower=*/ 1.4,
                 /*cachedUsageConsumePower=*/ 1.5,
                 /*foregroundUsageTimeInMs=*/ 1234L,
-                /*foregroundServiceUsageTimeInMs=*/ 3456L,
                 /*backgroundUsageTimeInMs=*/ 5689L,
                 /*batteryLevel=*/ 12);
     }
@@ -319,7 +311,6 @@
             double backgroundUsageConsumePower,
             double cachedUsageConsumePower,
             long foregroundUsageTimeInMs,
-            long foregroundServiceUsageTimeInMs,
             long backgroundUsageTimeInMs,
             int batteryLevel) {
         assertThat(entry.isValidEntry()).isTrue();
@@ -341,8 +332,6 @@
         assertThat(entry.mCachedUsageConsumePower).isEqualTo(cachedUsageConsumePower);
         assertThat(entry.mPercentOfTotal).isEqualTo(percentOfTotal);
         assertThat(entry.mForegroundUsageTimeInMs).isEqualTo(foregroundUsageTimeInMs);
-        assertThat(entry.mForegroundServiceUsageTimeInMs)
-                .isEqualTo(foregroundServiceUsageTimeInMs);
         assertThat(entry.mBackgroundUsageTimeInMs).isEqualTo(backgroundUsageTimeInMs);
         assertThat(entry.mDrainType).isEqualTo(drainType);
         assertThat(entry.mConsumerType)
@@ -364,7 +353,6 @@
             double backgroundUsageConsumePower,
             double cachedUsageConsumePower,
             long foregroundUsageTimeInMs,
-            long foregroundServiceUsageTimeInMs,
             long backgroundUsageTimeInMs,
             int batteryLevel) {
         final MatrixCursor cursor = new MatrixCursor(
@@ -399,7 +387,6 @@
                         .setPercentOfTotal(0.3)
                         .setDrainType(3)
                         .setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
-                        .setForegroundServiceUsageTimeInMs(foregroundServiceUsageTimeInMs)
                         .setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
                         .build();
         cursor.addRow(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
new file mode 100644
index 0000000..d6b5a3e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java
@@ -0,0 +1,310 @@
+/*
+ * 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.fuelgauge.batteryusage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.LocaleList;
+import android.text.format.DateUtils;
+
+import androidx.preference.PreferenceGroup;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+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;
+
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.TimeZone;
+
+@RunWith(RobolectricTestRunner.class)
+public final class BatteryUsageBreakdownControllerTest {
+    private static final String PREF_KEY = "pref_key";
+    private static final String PREF_SUMMARY = "fake preference summary";
+
+    @Mock
+    private InstrumentedPreferenceFragment mFragment;
+    @Mock
+    private SettingsActivity mSettingsActivity;
+    @Mock
+    private PreferenceGroup mAppListPreferenceGroup;
+    @Mock
+    private Drawable mDrawable;
+    @Mock
+    private BatteryHistEntry mBatteryHistEntry;
+    @Mock
+    private PowerGaugePreference mPowerGaugePreference;
+
+    private Context mContext;
+    private FakeFeatureFactory mFeatureFactory;
+    private BatteryDiffEntry mBatteryDiffEntry;
+    private MetricsFeatureProvider mMetricsFeatureProvider;
+    private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Locale.setDefault(new Locale("en_US"));
+        org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false);
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+        mFeatureFactory = FakeFeatureFactory.setupForTest();
+        mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
+        mContext = spy(RuntimeEnvironment.application);
+        final Resources resources = spy(mContext.getResources());
+        resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
+        doReturn(resources).when(mContext).getResources();
+        doReturn(new String[]{"com.android.gms.persistent"})
+                .when(mFeatureFactory.powerUsageFeatureProvider)
+                .getHideApplicationEntries(mContext);
+        mBatteryUsageBreakdownController = createController();
+        mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup;
+        mBatteryDiffEntry = new BatteryDiffEntry(
+                mContext,
+                /*foregroundUsageTimeInMs=*/ 1,
+                /*backgroundUsageTimeInMs=*/ 2,
+                /*consumePower=*/ 3,
+                /*foregroundUsageConsumePower=*/ 0,
+                /*foregroundServiceUsageConsumePower=*/ 1,
+                /*backgroundUsageConsumePower=*/ 2,
+                /*cachedUsageConsumePower=*/ 0,
+                mBatteryHistEntry);
+        mBatteryDiffEntry = spy(mBatteryDiffEntry);
+        mBatteryUsageBreakdownController.mBatteryDiffData =
+                new BatteryDiffData(Arrays.asList(mBatteryDiffEntry), Arrays.asList());
+        // Adds fake testing data.
+        BatteryDiffEntry.sResourceCache.put(
+                "fakeBatteryDiffEntryKey",
+                new BatteryEntry.NameAndIcon("fakeName", /*icon=*/ null, /*iconId=*/ 1));
+    }
+
+    @Test
+    public void onDestroy_clearPreferenceCacheAndPreferenceGroupRemoveAll() {
+        // Ensures the testing environment is correct.
+        mBatteryUsageBreakdownController.mPreferenceCache.put(
+                PREF_KEY, mPowerGaugePreference);
+        assertThat(mBatteryUsageBreakdownController.mPreferenceCache).hasSize(1);
+
+        mBatteryUsageBreakdownController.onDestroy();
+
+        assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
+    }
+
+    @Test
+    public void onDestroy_removeAllPreferenceFromPreferenceGroup() {
+        mBatteryUsageBreakdownController.onDestroy();
+        verify(mAppListPreferenceGroup).removeAll();
+    }
+
+    @Test
+    public void addAllPreferences_addAllPreferences() {
+        final String appLabel = "fake app label";
+        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
+        doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
+        doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
+        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
+        doReturn(null).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
+        doReturn(false).when(mBatteryDiffEntry).validForRestriction();
+
+        mBatteryUsageBreakdownController.addAllPreferences();
+
+        // Verifies the preference cache.
+        final PowerGaugePreference pref =
+                (PowerGaugePreference) mBatteryUsageBreakdownController.mPreferenceCache
+                        .get(PREF_KEY);
+        assertThat(pref).isNotNull();
+        // Verifies the added preference configuration.
+        verify(mAppListPreferenceGroup).addPreference(pref);
+        assertThat(pref.getKey()).isEqualTo(PREF_KEY);
+        assertThat(pref.getTitle().toString()).isEqualTo(appLabel);
+        assertThat(pref.getIcon()).isEqualTo(mDrawable);
+        assertThat(pref.getOrder()).isEqualTo(1);
+        assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry);
+        assertThat(pref.isSingleLineTitle()).isTrue();
+        assertThat(pref.isEnabled()).isFalse();
+    }
+
+    @Test
+    public void addPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() {
+        final String appLabel = "fake app label";
+        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
+        doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
+        doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
+        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
+        doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
+
+        mBatteryUsageBreakdownController.addAllPreferences();
+
+        verify(mAppListPreferenceGroup, never()).addPreference(any());
+    }
+
+    @Test
+    public void removeAndCacheAllPreferences_buildCacheAndRemoveAllPreference() {
+        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
+        doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0);
+        doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
+        doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
+        doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
+        // Ensures the testing data is correct.
+        assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
+
+        mBatteryUsageBreakdownController.removeAndCacheAllPreferences();
+
+        assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY))
+                .isEqualTo(mPowerGaugePreference);
+        verify(mAppListPreferenceGroup).removeAll();
+    }
+
+    @Test
+    public void handlePreferenceTreeClick_notPowerGaugePreference_returnFalse() {
+        assertThat(mBatteryUsageBreakdownController
+                .handlePreferenceTreeClick(mAppListPreferenceGroup)).isFalse();
+
+        verify(mMetricsFeatureProvider, never())
+                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM);
+        verify(mMetricsFeatureProvider, never())
+                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM);
+    }
+
+    @Test
+    public void handlePreferenceTreeClick_forAppEntry_returnTrue() {
+        doReturn(false).when(mBatteryHistEntry).isAppEntry();
+        doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
+
+        assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
+                mPowerGaugePreference)).isTrue();
+        verify(mMetricsFeatureProvider)
+                .action(
+                        SettingsEnums.OPEN_BATTERY_USAGE,
+                        SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM,
+                        SettingsEnums.OPEN_BATTERY_USAGE,
+                        /* package name */ "none",
+                        /* percentage of total */ 0);
+    }
+
+    @Test
+    public void handlePreferenceTreeClick_forSystemEntry_returnTrue() {
+        doReturn(true).when(mBatteryHistEntry).isAppEntry();
+        doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
+
+        assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
+                mPowerGaugePreference)).isTrue();
+        verify(mMetricsFeatureProvider)
+                .action(
+                        SettingsEnums.OPEN_BATTERY_USAGE,
+                        SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM,
+                        SettingsEnums.OPEN_BATTERY_USAGE,
+                        /* package name */ "none",
+                        /* percentage of total */ 0);
+    }
+
+    @Test
+    public void setPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() {
+        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+        pref.setSummary(PREF_SUMMARY);
+
+        mBatteryUsageBreakdownController.setPreferenceSummary(
+                pref, createBatteryDiffEntry(
+                        /*foregroundUsageTimeInMs=*/ 0,
+                        /*backgroundUsageTimeInMs=*/ 0));
+        assertThat(pref.getSummary()).isNull();
+    }
+
+    @Test
+    public void setPreferenceSummary_setBackgroundUsageTimeOnly() {
+        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+        pref.setSummary(PREF_SUMMARY);
+
+        mBatteryUsageBreakdownController.setPreferenceSummary(
+                pref, createBatteryDiffEntry(
+                        /*foregroundUsageTimeInMs=*/ 0,
+                        /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
+        assertThat(pref.getSummary().toString()).isEqualTo("Background: 1 min");
+    }
+
+    @Test
+    public void setPreferenceSummary_setTotalUsageTimeLessThanAMinute() {
+        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+        pref.setSummary(PREF_SUMMARY);
+
+        mBatteryUsageBreakdownController.setPreferenceSummary(
+                pref, createBatteryDiffEntry(
+                        /*foregroundUsageTimeInMs=*/ 100,
+                        /*backgroundUsageTimeInMs=*/ 200));
+        assertThat(pref.getSummary().toString()).isEqualTo("Total: less than a min");
+    }
+
+    @Test
+    public void setPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() {
+        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+        pref.setSummary(PREF_SUMMARY);
+
+        mBatteryUsageBreakdownController.setPreferenceSummary(
+                pref, createBatteryDiffEntry(
+                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
+                        /*backgroundUsageTimeInMs=*/ 200));
+        assertThat(pref.getSummary().toString())
+                .isEqualTo("Total: 1 min\nBackground: less than a min");
+    }
+
+    @Test
+    public void setPreferenceSummary_setTotalAndBackgroundUsageTime() {
+        final PowerGaugePreference pref = new PowerGaugePreference(mContext);
+        pref.setSummary(PREF_SUMMARY);
+
+        mBatteryUsageBreakdownController.setPreferenceSummary(
+                pref, createBatteryDiffEntry(
+                        /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS,
+                        /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS));
+        assertThat(pref.getSummary().toString()).isEqualTo("Total: 2 min\nBackground: 1 min");
+    }
+
+    private BatteryDiffEntry createBatteryDiffEntry(
+            long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) {
+        return new BatteryDiffEntry(
+                mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs, /*consumePower=*/ 0,
+                /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
+                /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
+                mBatteryHistEntry);
+    }
+
+    private BatteryUsageBreakdownController createController() {
+        final BatteryUsageBreakdownController controller =
+                new BatteryUsageBreakdownController(
+                        mContext, /*lifecycle=*/ null, mSettingsActivity, mFragment);
+        controller.mPrefContext = mContext;
+        return controller;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
index d6e7737..d578b89 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageContentProviderTest.java
@@ -202,7 +202,6 @@
                         .setCachedUsageConsumePower(3)
                         .setPercentOfTotal(0.9)
                         .setForegroundUsageTimeInMs(1000)
-                        .setForegroundServiceUsageTimeInMs(1500)
                         .setBackgroundUsageTimeInMs(2000)
                         .setDrainType(1)
                         .build();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
index 9a43557..978930a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java
@@ -70,7 +70,6 @@
         when(mMockBatteryEntry.getConsumedPowerInCached()).thenReturn(1.5);
         mMockBatteryEntry.mPercent = 0.3;
         when(mMockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
-        when(mMockBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(3456L);
         when(mMockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
         when(mMockBatteryEntry.getPowerComponentId()).thenReturn(expectedType);
         when(mMockBatteryEntry.getConsumerType())
@@ -112,7 +111,6 @@
         assertThat(batteryInformation.getCachedUsageConsumePower()).isEqualTo(1.5);
         assertThat(batteryInformation.getPercentOfTotal()).isEqualTo(0.3);
         assertThat(batteryInformation.getForegroundUsageTimeInMs()).isEqualTo(1234L);
-        assertThat(batteryInformation.getForegroundServiceUsageTimeInMs()).isEqualTo(3456L);
         assertThat(batteryInformation.getBackgroundUsageTimeInMs()).isEqualTo(5689L);
         assertThat(batteryInformation.getDrainType()).isEqualTo(expectedType);
         assertThat(deviceBatteryState.getBatteryLevel()).isEqualTo(12);
@@ -169,7 +167,6 @@
         when(mMockBatteryEntry.getConsumedPowerInCached()).thenReturn(1.5);
         mMockBatteryEntry.mPercent = 0.3;
         when(mMockBatteryEntry.getTimeInForegroundMs()).thenReturn(1234L);
-        when(mMockBatteryEntry.getTimeInForegroundServiceMs()).thenReturn(3456L);
         when(mMockBatteryEntry.getTimeInBackgroundMs()).thenReturn(5689L);
         when(mMockBatteryEntry.getPowerComponentId()).thenReturn(expectedType);
         when(mMockBatteryEntry.getConsumerType())
@@ -202,8 +199,6 @@
         assertThat(batteryHistEntry.mPercentOfTotal).isEqualTo(0.3);
         assertThat(batteryHistEntry.mForegroundUsageTimeInMs)
                 .isEqualTo(1234L);
-        assertThat(batteryHistEntry.mForegroundServiceUsageTimeInMs)
-                .isEqualTo(3456L);
         assertThat(batteryHistEntry.mBackgroundUsageTimeInMs)
                 .isEqualTo(5689L);
         assertThat(batteryHistEntry.mDrainType).isEqualTo(expectedType);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
index cdfed06..0926d14 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
@@ -536,8 +536,7 @@
                 /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
-                /*foregroundUsageTimeInMs=*/ 0L, /*foregroundServiceUsageTimeInMs=*/ 0L,
-                /*backgroundUsageTimeInMs=*/ 0L);
+                /*foregroundUsageTimeInMs=*/ 0L,  /*backgroundUsageTimeInMs=*/ 0L);
         // Adds the index = 0 data.
         Map<String, BatteryHistEntry> entryMap = new HashMap<>();
         BatteryHistEntry entry = createBatteryHistEntry(
@@ -546,7 +545,7 @@
                 /*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 10L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         entryMap.put(fakeEntry.getKey(), fakeEntry);
         batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
@@ -562,7 +561,7 @@
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 15L,
-                /*foregroundServiceUsageTimeInMs=*/ 15L, /*backgroundUsageTimeInMs=*/ 25L);
+                /*backgroundUsageTimeInMs=*/ 25L);
         entryMap.put(entry.getKey(), entry);
         entryMap.put(fakeEntry.getKey(), fakeEntry);
         batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
@@ -574,7 +573,7 @@
                 /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 25L,
-                /*foregroundServiceUsageTimeInMs=*/ 25L, /*backgroundUsageTimeInMs=*/ 35L);
+                /*backgroundUsageTimeInMs=*/ 35L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 10.0,
@@ -582,7 +581,7 @@
                 /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
                 /*uid=*/ 3L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 40L,
-                /*foregroundServiceUsageTimeInMs=*/ 40L, /*backgroundUsageTimeInMs=*/ 50L);
+                /*backgroundUsageTimeInMs=*/ 50L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package3", "label3", /*consumePower=*/ 15.0,
@@ -590,7 +589,7 @@
                 /*backgroundUsageConsumePower=*/ 3, /*cachedUsageConsumePower=*/ 3,
                 /*uid=*/ 4L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L,
-                /*foregroundServiceUsageTimeInMs=*/ 5L, /*backgroundUsageTimeInMs=*/ 5L);
+                /*backgroundUsageTimeInMs=*/ 5L);
         entryMap.put(entry.getKey(), entry);
         entryMap.put(fakeEntry.getKey(), fakeEntry);
         batteryHistoryMap.put(batteryHistoryKeys[3], entryMap);
@@ -602,7 +601,7 @@
                 /*backgroundUsageConsumePower=*/ 9, /*cachedUsageConsumePower=*/ 8,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
-                /*foregroundServiceUsageTimeInMs=*/ 30L, /*backgroundUsageTimeInMs=*/ 40L);
+                /*backgroundUsageTimeInMs=*/ 40L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 20.0,
@@ -610,7 +609,7 @@
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
                 /*uid=*/ 3L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*foregroundUsageTimeInMs=*/ 50L,
-                /*foregroundServiceUsageTimeInMs=*/ 50L, /*backgroundUsageTimeInMs=*/ 60L);
+                /*backgroundUsageTimeInMs=*/ 60L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package3", "label3", /*consumePower=*/ 40.0,
@@ -618,7 +617,7 @@
                 /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
                 /*uid=*/ 4L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 5L,
-                /*foregroundServiceUsageTimeInMs=*/ 5L, /*backgroundUsageTimeInMs=*/ 5L);
+                /*backgroundUsageTimeInMs=*/ 5L);
         entryMap.put(entry.getKey(), entry);
         entryMap.put(fakeEntry.getKey(), fakeEntry);
         batteryHistoryMap.put(batteryHistoryKeys[4], entryMap);
@@ -648,52 +647,45 @@
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 40.0,
                 /*foregroundUsageConsumePower=*/ 14, /*foregroundServiceUsageConsumePower=*/ 9,
                 /*backgroundUsageConsumePower=*/ 9, /*cachedUsageConsumePower=*/ 8,
-                /*foregroundUsageTimeInMs=*/ 30, /*foregroundServiceUsageTimeInMs=*/ 30,
-                /*backgroundUsageTimeInMs=*/ 40);
+                /*foregroundUsageTimeInMs=*/ 30, /*backgroundUsageTimeInMs=*/ 40);
         assertBatteryDiffEntry(
                 resultDiffData.getAppDiffEntryList().get(1), currentUserId, /*uid=*/ 4L,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 40.0,
                 /*foregroundUsageConsumePower=*/ 8, /*foregroundServiceUsageConsumePower=*/ 8,
                 /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
-                /*foregroundUsageTimeInMs=*/ 5, /*foregroundServiceUsageTimeInMs=*/ 5,
-                /*backgroundUsageTimeInMs=*/ 5);
+                /*foregroundUsageTimeInMs=*/ 5, /*backgroundUsageTimeInMs=*/ 5);
         assertBatteryDiffEntry(
                 resultDiffData.getSystemDiffEntryList().get(0), currentUserId, /*uid=*/ 3L,
                 ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*consumePercentage=*/ 20.0,
                 /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
-                /*foregroundUsageTimeInMs=*/ 50, /*foregroundServiceUsageTimeInMs=*/ 50,
-                /*backgroundUsageTimeInMs=*/ 60);
+                /*foregroundUsageTimeInMs=*/ 50, /*backgroundUsageTimeInMs=*/ 60);
         resultDiffData = resultMap.get(0).get(DataProcessor.SELECTED_INDEX_ALL);
         assertBatteryDiffEntry(
                 resultDiffData.getAppDiffEntryList().get(0), currentUserId, /*uid=*/ 2L,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 100.0,
                 /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
-                /*foregroundUsageTimeInMs=*/ 15, /*foregroundServiceUsageTimeInMs=*/ 15,
-                /*backgroundUsageTimeInMs=*/ 25);
+                /*foregroundUsageTimeInMs=*/ 15, /*backgroundUsageTimeInMs=*/ 25);
         resultDiffData = resultMap.get(1).get(DataProcessor.SELECTED_INDEX_ALL);
         assertBatteryDiffEntry(
                 resultDiffData.getAppDiffEntryList().get(0), currentUserId, /*uid=*/ 4L,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 50.0,
                 /*foregroundUsageConsumePower=*/ 8, /*foregroundServiceUsageConsumePower=*/ 8,
                 /*backgroundUsageConsumePower=*/ 8, /*cachedUsageConsumePower=*/ 8,
-                /*foregroundUsageTimeInMs=*/ 5, /*foregroundServiceUsageTimeInMs=*/ 5,
-                /*backgroundUsageTimeInMs=*/ 5);
+                /*foregroundUsageTimeInMs=*/ 5, /*backgroundUsageTimeInMs=*/ 5);
         assertBatteryDiffEntry(
                 resultDiffData.getAppDiffEntryList().get(1), currentUserId, /*uid=*/ 2L,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 25.0,
                 /*foregroundUsageConsumePower=*/ 9, /*foregroundServiceUsageConsumePower=*/ 4,
                 /*backgroundUsageConsumePower=*/ 4, /*cachedUsageConsumePower=*/ 3,
-                /*foregroundUsageTimeInMs=*/ 15, /*foregroundServiceUsageTimeInMs=*/ 15,
-                /*backgroundUsageTimeInMs=*/ 15);
+                /*foregroundUsageTimeInMs=*/ 15, /*backgroundUsageTimeInMs=*/ 15);
         assertBatteryDiffEntry(
                 resultDiffData.getSystemDiffEntryList().get(0), currentUserId, /*uid=*/ 3L,
                 ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*consumePercentage=*/ 25.0,
                 /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
-                /*foregroundUsageTimeInMs=*/ 50, /*foregroundServiceUsageTimeInMs=*/ 50,
-                /*backgroundUsageTimeInMs=*/ 60);
+                /*foregroundUsageTimeInMs=*/ 50, /*backgroundUsageTimeInMs=*/ 60);
         verify(mMetricsFeatureProvider)
                 .action(mContext.getApplicationContext(),
                         SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
@@ -721,7 +713,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 10L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package1", "label1", /*consumePower=*/ 10.0,
@@ -729,7 +721,7 @@
                 /*backgroundUsageConsumePower=*/ 1, /*cachedUsageConsumePower=*/ 1,
                 /*uid=*/ 2L, currentUserId + 1,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 10L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 5.0,
@@ -737,7 +729,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 3L, currentUserId + 2,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
-                /*foregroundServiceUsageTimeInMs=*/ 20L, /*backgroundUsageTimeInMs=*/ 30L);
+                /*backgroundUsageTimeInMs=*/ 30L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
         // Adds the index = 1 data.
@@ -748,7 +740,7 @@
                 /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
-                /*foregroundServiceUsageTimeInMs=*/ 20L, /*backgroundUsageTimeInMs=*/ 30L);
+                /*backgroundUsageTimeInMs=*/ 30L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package1", "label1", /*consumePower=*/ 30.0,
@@ -756,7 +748,7 @@
                 /*backgroundUsageConsumePower=*/ 2, /*cachedUsageConsumePower=*/ 2,
                 /*uid=*/ 2L, currentUserId + 1,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 10L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 15.0,
@@ -764,7 +756,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 3L, currentUserId + 2,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
-                /*foregroundServiceUsageTimeInMs=*/ 30L, /*backgroundUsageTimeInMs=*/ 30L);
+                /*backgroundUsageTimeInMs=*/ 30L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
         // Adds the index = 2 data.
@@ -775,7 +767,7 @@
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
-                /*foregroundServiceUsageTimeInMs=*/ 25L, /*backgroundUsageTimeInMs=*/ 30L);
+                /*backgroundUsageTimeInMs=*/ 30L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package1", "label1", /*consumePower=*/ 50.0,
@@ -783,7 +775,7 @@
                 /*backgroundUsageConsumePower=*/ 10, /*cachedUsageConsumePower=*/ 10,
                 /*uid=*/ 2L, currentUserId + 1,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 20L,
-                /*foregroundServiceUsageTimeInMs=*/ 25L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 25.0,
@@ -791,7 +783,7 @@
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 3L, currentUserId + 2,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 30L,
-                /*foregroundServiceUsageTimeInMs=*/ 35L, /*backgroundUsageTimeInMs=*/ 30L);
+                /*backgroundUsageTimeInMs=*/ 30L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
         final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
@@ -814,16 +806,14 @@
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 25.0,
                 /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
-                /*foregroundUsageTimeInMs=*/ 10, /*foregroundServiceUsageTimeInMs=*/ 15,
-                /*backgroundUsageTimeInMs=*/ 10);
+                /*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 10);
         assertBatteryDiffEntry(
                 resultDiffData.getSystemDiffEntryList().get(0), BatteryUtils.UID_OTHER_USERS,
                 /*uid=*/ BatteryUtils.UID_OTHER_USERS, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
                 /*consumePercentage=*/ 75.0,
                 /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
-                /*foregroundUsageTimeInMs=*/ 0, /*foregroundServiceUsageTimeInMs=*/ 0,
-                /*backgroundUsageTimeInMs=*/ 0);
+                /*foregroundUsageTimeInMs=*/ 0, /*backgroundUsageTimeInMs=*/ 0);
         assertThat(resultMap.get(0).get(0)).isNotNull();
         assertThat(resultMap.get(0).get(DataProcessor.SELECTED_INDEX_ALL)).isNotNull();
         verify(mMetricsFeatureProvider)
@@ -853,7 +843,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
         // Adds the index = 1 data.
@@ -864,7 +854,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
         // Adds the index = 2 data.
@@ -875,7 +865,6 @@
                 /*backgroundUsageConsumePower=*/ 100, /*cachedUsageConsumePower=*/ 100,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 3600000L,
-                /*foregroundServiceUsageTimeInMs=*/ 1800000L,
                 /*backgroundUsageTimeInMs=*/ 7200000L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
@@ -899,8 +888,6 @@
         final BatteryDiffEntry resultEntry = resultDiffData.getAppDiffEntryList().get(0);
         assertThat(resultEntry.mForegroundUsageTimeInMs)
                 .isEqualTo(Math.round(entry.mForegroundUsageTimeInMs * ratio));
-        assertThat(resultEntry.mForegroundServiceUsageTimeInMs)
-                .isEqualTo(Math.round(entry.mForegroundServiceUsageTimeInMs * ratio));
         assertThat(resultEntry.mBackgroundUsageTimeInMs)
                 .isEqualTo(Math.round(entry.mBackgroundUsageTimeInMs * ratio));
         assertThat(resultEntry.mConsumePower)
@@ -942,7 +929,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 0,
@@ -950,7 +937,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
         // Adds the index = 1 data.
@@ -961,7 +948,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 0,
@@ -969,7 +956,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
         // Adds the index = 2 data.
@@ -980,7 +967,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 15L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 10.0,
@@ -988,7 +975,7 @@
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 15L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
         final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
@@ -1013,8 +1000,7 @@
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 50.0,
                 /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
-                /*foregroundUsageTimeInMs=*/ 10, /*foregroundServiceUsageTimeInMs=*/ 15,
-                /*backgroundUsageTimeInMs=*/ 20);
+                /*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 20);
         verify(mMetricsFeatureProvider)
                 .action(mContext.getApplicationContext(),
                         SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
@@ -1042,7 +1028,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 0,
@@ -1050,7 +1036,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[0], entryMap);
         // Adds the index = 1 data.
@@ -1061,7 +1047,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 0,
@@ -1069,7 +1055,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 0L,
-                /*foregroundServiceUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L);
+                /*backgroundUsageTimeInMs=*/ 0L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[1], entryMap);
         // Adds the index = 2 data.
@@ -1080,7 +1066,7 @@
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
                 /*uid=*/ 1L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 15L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         entry = createBatteryHistEntry(
                 "package2", "label2", /*consumePower=*/ 10.0,
@@ -1088,7 +1074,7 @@
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
                 /*uid=*/ 2L, currentUserId,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*foregroundUsageTimeInMs=*/ 10L,
-                /*foregroundServiceUsageTimeInMs=*/ 15L, /*backgroundUsageTimeInMs=*/ 20L);
+                /*backgroundUsageTimeInMs=*/ 20L);
         entryMap.put(entry.getKey(), entry);
         batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
         final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
@@ -1141,7 +1127,6 @@
         doReturn(0.0).when(mMockBatteryEntry1).getConsumedPowerInBackground();
         doReturn(0.0).when(mMockBatteryEntry1).getConsumedPowerInCached();
         doReturn(30L).when(mMockBatteryEntry1).getTimeInForegroundMs();
-        doReturn(20L).when(mMockBatteryEntry1).getTimeInForegroundServiceMs();
         doReturn(40L).when(mMockBatteryEntry1).getTimeInBackgroundMs();
         doReturn(1).when(mMockBatteryEntry1).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).when(mMockBatteryEntry1).getConsumerType();
@@ -1151,7 +1136,6 @@
         doReturn(0.0).when(mMockBatteryEntry2).getConsumedPowerInBackground();
         doReturn(0.0).when(mMockBatteryEntry2).getConsumedPowerInCached();
         doReturn(20L).when(mMockBatteryEntry2).getTimeInForegroundMs();
-        doReturn(30L).when(mMockBatteryEntry2).getTimeInForegroundServiceMs();
         doReturn(20L).when(mMockBatteryEntry2).getTimeInBackgroundMs();
         doReturn(2).when(mMockBatteryEntry2).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).when(mMockBatteryEntry2).getConsumerType();
@@ -1161,7 +1145,6 @@
         doReturn(0.0).when(mMockBatteryEntry3).getConsumedPowerInBackground();
         doReturn(0.0).when(mMockBatteryEntry3).getConsumedPowerInCached();
         doReturn(0L).when(mMockBatteryEntry3).getTimeInForegroundMs();
-        doReturn(0L).when(mMockBatteryEntry3).getTimeInForegroundServiceMs();
         doReturn(0L).when(mMockBatteryEntry3).getTimeInBackgroundMs();
         doReturn(3).when(mMockBatteryEntry3).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).when(mMockBatteryEntry3).getConsumerType();
@@ -1171,7 +1154,6 @@
         doReturn(0.3).when(mMockBatteryEntry4).getConsumedPowerInBackground();
         doReturn(0.1).when(mMockBatteryEntry4).getConsumedPowerInCached();
         doReturn(10L).when(mMockBatteryEntry4).getTimeInForegroundMs();
-        doReturn(15L).when(mMockBatteryEntry4).getTimeInForegroundServiceMs();
         doReturn(10L).when(mMockBatteryEntry4).getTimeInBackgroundMs();
         doReturn(4).when(mMockBatteryEntry4).getUid();
         doReturn(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY)
@@ -1187,22 +1169,19 @@
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 25.0,
                 /*foregroundUsageConsumePower=*/ 0.5, /*foregroundServiceUsageConsumePower=*/ 0,
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
-                /*foregroundUsageTimeInMs=*/ 20, /*foregroundServiceUsageTimeInMs=*/ 30,
-                /*backgroundUsageTimeInMs=*/ 20);
+                /*foregroundUsageTimeInMs=*/ 20, /*backgroundUsageTimeInMs=*/ 20);
         assertBatteryDiffEntry(
                 batteryDiffData.getAppDiffEntryList().get(1), 0, /*uid=*/ 1L,
                 ConvertUtils.CONSUMER_TYPE_UID_BATTERY, /*consumePercentage=*/ 0.0,
                 /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
                 /*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
-                /*foregroundUsageTimeInMs=*/ 30, /*foregroundServiceUsageTimeInMs=*/ 20,
-                /*backgroundUsageTimeInMs=*/ 40);
+                /*foregroundUsageTimeInMs=*/ 30, /*backgroundUsageTimeInMs=*/ 40);
         assertBatteryDiffEntry(
                 batteryDiffData.getSystemDiffEntryList().get(0), 0, /*uid=*/ 4L,
                 ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY, /*consumePercentage=*/ 75.0,
                 /*foregroundUsageConsumePower=*/ 0.9, /*foregroundServiceUsageConsumePower=*/ 0.2,
                 /*backgroundUsageConsumePower=*/ 0.3, /*cachedUsageConsumePower=*/ 0.1,
-                /*foregroundUsageTimeInMs=*/ 10, /*foregroundServiceUsageTimeInMs=*/ 15,
-                /*backgroundUsageTimeInMs=*/ 10);
+                /*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 10);
     }
 
     private static Map<Long, Map<String, BatteryHistEntry>> createHistoryMap(
@@ -1241,8 +1220,7 @@
             final double foregroundServiceUsageConsumePower,
             final double backgroundUsageConsumePower, final double cachedUsageConsumePower,
             final long uid, final long userId, final int consumerType,
-            final long foregroundUsageTimeInMs, final long foregroundServiceUsageTimeInMs,
-            final long backgroundUsageTimeInMs) {
+            final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs) {
         // Only insert required fields.
         final BatteryInformation batteryInformation =
                 BatteryInformation
@@ -1254,7 +1232,6 @@
                         .setBackgroundUsageConsumePower(backgroundUsageConsumePower)
                         .setCachedUsageConsumePower(cachedUsageConsumePower)
                         .setForegroundUsageTimeInMs(foregroundUsageTimeInMs)
-                        .setForegroundServiceUsageTimeInMs(foregroundServiceUsageTimeInMs)
                         .setBackgroundUsageTimeInMs(backgroundUsageTimeInMs)
                         .build();
         final ContentValues values = new ContentValues();
@@ -1333,8 +1310,7 @@
             final double foregroundUsageConsumePower,
             final double foregroundServiceUsageConsumePower,
             final double backgroundUsageConsumePower, final double cachedUsageConsumePower,
-            final long foregroundUsageTimeInMs, final long foregroundServiceUsageTimeInMs,
-            final long backgroundUsageTimeInMs) {
+            final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs) {
         assertThat(entry.mBatteryHistEntry.mUserId).isEqualTo(userId);
         assertThat(entry.mBatteryHistEntry.mUid).isEqualTo(uid);
         assertThat(entry.mBatteryHistEntry.mConsumerType).isEqualTo(consumerType);
@@ -1345,8 +1321,6 @@
         assertThat(entry.mBackgroundUsageConsumePower).isEqualTo(backgroundUsageConsumePower);
         assertThat(entry.mCachedUsageConsumePower).isEqualTo(cachedUsageConsumePower);
         assertThat(entry.mForegroundUsageTimeInMs).isEqualTo(foregroundUsageTimeInMs);
-        assertThat(entry.mForegroundServiceUsageTimeInMs)
-                .isEqualTo(foregroundServiceUsageTimeInMs);
         assertThat(entry.mBackgroundUsageTimeInMs).isEqualTo(backgroundUsageTimeInMs);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ExpandDividerPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ExpandDividerPreferenceTest.java
deleted file mode 100644
index e36f948..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ExpandDividerPreferenceTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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.fuelgauge.batteryusage;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public final class ExpandDividerPreferenceTest {
-
-    private Context mContext;
-    private ExpandDividerPreference mExpandDividerPreference;
-
-    private ImageView mImageView;
-    private TextView mTextView;
-
-    @Before
-    public void setUp() {
-        mContext = spy(RuntimeEnvironment.application);
-        mImageView = spy(new ImageView(mContext));
-        mTextView = spy(new TextView(mContext));
-        mExpandDividerPreference = new ExpandDividerPreference(mContext);
-        doReturn(R.id.expand_title).when(mTextView).getId();
-        doReturn(R.id.expand_icon).when(mImageView).getId();
-    }
-
-    @Test
-    public void testConstructor_returnExpectedResult() {
-        assertThat(mExpandDividerPreference.getKey())
-                .isEqualTo(ExpandDividerPreference.PREFERENCE_KEY);
-        assertThat(mExpandDividerPreference.getLayoutResource())
-                .isEqualTo(R.layout.preference_expand_divider);
-    }
-
-    @Test
-    public void testSetTitle_setTitleContentIntoTextView() {
-        final String titleContent = "title content";
-        mExpandDividerPreference.mTextView = mTextView;
-
-        mExpandDividerPreference.setTitle(titleContent);
-
-        verify(mTextView).setText(titleContent);
-    }
-
-    @Test
-    public void testOnClick_switchExpandStateAndInvokeCallback() {
-        final boolean[] isExpandedArray = new boolean[]{false};
-        mExpandDividerPreference.mImageView = mImageView;
-        mExpandDividerPreference.setOnExpandListener(
-                isExpanded -> isExpandedArray[0] = isExpanded);
-
-        // Click the item first time from false -> true.
-        mExpandDividerPreference.onClick();
-        // Verifies the first time click result.
-        verify(mImageView).setImageResource(R.drawable.ic_settings_expand_less);
-        assertThat(isExpandedArray[0]).isTrue();
-
-        // Clicks the item second time from true -> false.
-        mExpandDividerPreference.onClick();
-        // Verifies the second time click result.
-        verify(mImageView).setImageResource(R.drawable.ic_settings_expand_more);
-        assertThat(isExpandedArray[0]).isFalse();
-    }
-
-    @Test
-    public void testSetIsExpanded_updateStateButNotInvokeCallback() {
-        final boolean[] isExpandedArray = new boolean[]{false};
-        mExpandDividerPreference.mImageView = mImageView;
-        mExpandDividerPreference.setOnExpandListener(
-                isExpanded -> isExpandedArray[0] = isExpanded);
-
-        mExpandDividerPreference.setIsExpanded(true);
-
-        verify(mImageView).setImageResource(R.drawable.ic_settings_expand_less);
-        assertThat(isExpandedArray[0]).isFalse();
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TabPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TabPreferenceTest.java
new file mode 100644
index 0000000..c106b48
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/TabPreferenceTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.fuelgauge.batteryusage;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+
+import com.google.android.material.tabs.TabLayout;
+
+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 TabPreferenceTest {
+
+    private Context mContext;
+    private TabPreference mTabPreference;
+
+    @Mock
+    private Fragment mMockFragment;
+    @Mock
+    private TabLayout mMockTabLayout;
+
+    private final String[] mTabTitles = new String[]{"tab1", "tab2"};
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        mTabPreference = new TabPreference(mContext, /*attrs=*/ null);
+    }
+
+    @Test
+    public void constructor_returnExpectedResult() {
+        assertThat(mTabPreference.getLayoutResource()).isEqualTo(R.layout.preference_tab);
+    }
+
+    @Test
+    public void initializeTabs_returnExpectedResult() {
+        mTabPreference.initializeTabs(mMockFragment, mTabTitles);
+        assertThat(mTabPreference.mTabTitles).isEqualTo(mTabTitles);
+    }
+
+    @Test
+    public void onSaveInstanceState_returnExpectedResult() {
+        doReturn(1).when(mMockTabLayout).getSelectedTabPosition();
+        mTabPreference.mTabLayout = mMockTabLayout;
+        TabPreference.SavedState savedState =
+                (TabPreference.SavedState) mTabPreference.onSaveInstanceState();
+        assertThat(savedState.getTabPosition()).isEqualTo(1);
+    }
+
+    @Test
+    public void onRestoreInstanceState_returnExpectedResult() {
+        TabPreference.SavedState savedState =
+                new TabPreference.SavedState(Preference.BaseSavedState.EMPTY_STATE, 2);
+        mTabPreference.onRestoreInstanceState(savedState);
+        assertThat(mTabPreference.mSavedTabPosition).isEqualTo(2);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
index 002e4fd..9b9003e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/db/BatteryStateTest.java
@@ -63,7 +63,6 @@
                         .setPercentOfTotal(10)
                         .setDrainType(1)
                         .setForegroundUsageTimeInMs(60000)
-                        .setForegroundServiceUsageTimeInMs(30000)
                         .setBackgroundUsageTimeInMs(10000)
                         .build();
     }
diff --git a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
index 2d023d7..251b1d7 100644
--- a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
@@ -114,6 +114,7 @@
     @Test
     public void isSupportEndItem_withBleDevice_returnsTrue() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
         doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
 
         assertThat(mController.isSupportEndItem()).isTrue();
@@ -130,14 +131,35 @@
     @Test
     public void isSupportEndItem_withNonBleDevice_returnsFalse() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
         doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
 
         assertThat(mController.isSupportEndItem()).isFalse();
     }
 
     @Test
+    public void isSupportEndItem_deviceIsBroadcastingAndConnectedToNonBleDevice_returnsTrue() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(true).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
+        doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
+
+        assertThat(mController.isSupportEndItem()).isTrue();
+    }
+
+    @Test
+    public void isSupportEndItem_deviceIsNotBroadcastingAndConnectedToNonBleDevice_returnsFalse() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
+        doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
+
+        assertThat(mController.isSupportEndItem()).isFalse();
+    }
+
+
+    @Test
     public void getSliceEndItem_NotSupportEndItem_getsNullSliceAction() {
         doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
         doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
 
         final SliceAction sliceAction = mController.getSliceEndItem(mContext);
diff --git a/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java b/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
index 207fa61..2b9ecf7 100644
--- a/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
+++ b/tests/robotests/src/com/android/settings/security/MemtagHelperTest.java
@@ -87,6 +87,14 @@
     }
 
     @Test
+    public void getAvailabilityStatus_isForcedOn_isDISABLED_DEPENDENT_SETTING() {
+        ShadowSystemProperties.override(mDeviceConfigOverride, "force_on");
+        ShadowSystemProperties.override(mMemtagSupportedProperty, "true");
+        assertThat(MemtagHelper.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING);
+    }
+
+    @Test
     public void getAvailabilityStatus_isUnsupported_isUNSUPPORTED_ON_DEVICE() {
         ShadowSystemProperties.override(mDeviceConfigOverride, "");
         ShadowSystemProperties.override(mMemtagSupportedProperty, "false");
@@ -159,4 +167,13 @@
         ShadowSystemProperties.override(mMemtagProperty, "memtag");
         assertThat(MemtagHelper.getSummary()).isEqualTo(R.string.memtag_force_off);
     }
+
+    @Test
+    @Config(shadows = {ZygoteShadow.class})
+    public void getSummary_forceOffOverride_memtag_force_on() {
+        ZygoteShadow.setSupportsMemoryTagging(false);
+        ShadowSystemProperties.override(mDeviceConfigOverride, "force_on");
+        ShadowSystemProperties.override(mMemtagProperty, "memtag");
+        assertThat(MemtagHelper.getSummary()).isEqualTo(R.string.memtag_force_on);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index 485caef..f119d6e6 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -107,7 +107,6 @@
                         .setPercentOfTotal(10f)
                         .setDrainType(1)
                         .setForegroundUsageTimeInMs(60000)
-                        .setForegroundServiceUsageTimeInMs(30000)
                         .setBackgroundUsageTimeInMs(10000)
                         .setForegroundUsageConsumePower(0.1f)
                         .setForegroundServiceUsageConsumePower(0.05f)
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
new file mode 100644
index 0000000..1a5f3ab
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/spa/app/AllAppListTest.kt
@@ -0,0 +1,180 @@
+/*
+ * 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.spa.app
+
+import android.content.Context
+import android.content.pm.ApplicationInfo
+import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.State
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.performClick
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.android.settingslib.spa.framework.compose.stateOf
+import com.android.settingslib.spa.testutils.FakeNavControllerWrapper
+import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
+import com.android.settingslib.spaprivileged.template.app.AppListInput
+import com.android.settingslib.spaprivileged.template.app.AppListItemModel
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.test.runTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class AllAppListTest {
+    @get:Rule
+    val composeTestRule = createComposeRule()
+
+    private val context: Context = ApplicationProvider.getApplicationContext()
+
+    private val fakeNavControllerWrapper = FakeNavControllerWrapper()
+
+    @Test
+    fun allAppListPageProvider_name() {
+        assertThat(AllAppListPageProvider.name).isEqualTo("AllAppList")
+    }
+
+    @Test
+    fun injectEntry_title() {
+        setInjectEntry()
+
+        composeTestRule.onNodeWithText(context.getString(R.string.all_apps)).assertIsDisplayed()
+    }
+
+    @Test
+    fun injectEntry_onClick_navigate() {
+        setInjectEntry()
+
+        composeTestRule.onNodeWithText(context.getString(R.string.all_apps)).performClick()
+
+        assertThat(fakeNavControllerWrapper.navigateCalledWith).isEqualTo("AllAppList")
+    }
+
+    private fun setInjectEntry() {
+        composeTestRule.setContent {
+            fakeNavControllerWrapper.Wrapper {
+                AllAppListPageProvider.buildInjectEntry().build().UiLayout()
+            }
+        }
+    }
+
+    @Test
+    fun title_displayed() {
+        composeTestRule.setContent {
+            AllAppListPage {}
+        }
+
+        composeTestRule.onNodeWithText(context.getString(R.string.all_apps)).assertIsDisplayed()
+    }
+
+    @Test
+    fun showInstantApps_isTrue() {
+        val input = getAppListInput()
+
+        assertThat(input.config.showInstantApps).isTrue()
+    }
+
+    @Test
+    fun item_labelDisplayed() {
+        setItemContent()
+
+        composeTestRule.onNodeWithText(LABEL).assertIsDisplayed()
+    }
+
+    @Test
+    fun item_summaryDisplayed() {
+        setItemContent()
+
+        composeTestRule.onNodeWithText(SUMMARY).assertIsDisplayed()
+    }
+
+    @Test
+    fun item_onClick_navigate() {
+        setItemContent()
+
+        composeTestRule.onNodeWithText(LABEL).performClick()
+
+        assertThat(fakeNavControllerWrapper.navigateCalledWith)
+            .isEqualTo("AppInfoSettings/package.name/0")
+    }
+
+    @OptIn(ExperimentalCoroutinesApi::class)
+    @Test
+    fun allAppListModel_transform() = runTest {
+        val listModel = AllAppListModel { stateOf(SUMMARY) }
+
+        val recordListFlow = listModel.transform(flowOf(USER_ID), flowOf(listOf(APP)))
+
+        val recordList = recordListFlow.firstWithTimeoutOrNull()!!
+        assertThat(recordList).hasSize(1)
+        assertThat(recordList[0].app).isSameInstanceAs(APP)
+    }
+
+    @Test
+    fun allAppListModel_getSummary() {
+        val listModel = AllAppListModel { stateOf(SUMMARY) }
+
+        lateinit var summaryState: State<String>
+        composeTestRule.setContent {
+            summaryState = listModel.getSummary(option = 0, record = AppRecordWithSize(app = APP))
+        }
+
+        assertThat(summaryState.value).isEqualTo(SUMMARY)
+    }
+
+    private fun getAppListInput(): AppListInput<AppRecordWithSize> {
+        lateinit var input: AppListInput<AppRecordWithSize>
+        composeTestRule.setContent {
+            AllAppListPage {
+                SideEffect {
+                    input = this
+                }
+            }
+        }
+        return input
+    }
+
+    private fun setItemContent() {
+        composeTestRule.setContent {
+            AllAppListPage {
+                fakeNavControllerWrapper.Wrapper {
+                    AppListItemModel(
+                        record = AppRecordWithSize(app = APP),
+                        label = LABEL,
+                        summary = stateOf(SUMMARY),
+                    ).appItem()
+                }
+            }
+        }
+    }
+
+    private companion object {
+        const val USER_ID = 0
+        const val PACKAGE_NAME = "package.name"
+        const val LABEL = "Label"
+        const val SUMMARY = "Summary"
+        val APP = ApplicationInfo().apply {
+            packageName = PACKAGE_NAME
+        }
+    }
+}
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt
index b144ad6..ffd5831 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/ResetAppPreferencesTest.kt
@@ -28,14 +28,12 @@
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mockito.Spy
 
 @RunWith(AndroidJUnit4::class)
 class ResetAppPreferencesTest {
     @get:Rule
     val composeTestRule = createComposeRule()
 
-    @Spy
     private val context: Context = ApplicationProvider.getApplicationContext()
 
     @Test
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt
index 39524df..b4545d4 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/AppLocalePreferenceTest.kt
@@ -131,10 +131,11 @@
                 AppLocalePreference(APP)
             }
         }
+        composeTestRule.delay()
     }
 
     private companion object {
-        const val PACKAGE_NAME = "packageName"
+        const val PACKAGE_NAME = "package.name"
         const val UID = 123
         val APP = ApplicationInfo().apply {
             packageName = PACKAGE_NAME