diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 3ef7c45..2ebff34 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -113,6 +113,7 @@
         private String mUsagePercent;
         private String mPackageName;
         private String mAppLabel;
+        private String mSlotInformation;
         private int mUid;
         private int mIconId;
         private int mConsumedPower;
@@ -124,18 +125,22 @@
     /** Launches battery details page for an individual battery consumer. */
     public static void startBatteryDetailPage(
             Activity caller, InstrumentedPreferenceFragment fragment,
-            BatteryDiffEntry diffEntry, String usagePercent) {
+            BatteryDiffEntry diffEntry, String usagePercent,
+            boolean isValidToShowSummary, String slotInformation) {
         final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
         final LaunchBatteryDetailPageArgs launchArgs = new LaunchBatteryDetailPageArgs();
         // configure the launch argument.
         launchArgs.mUsagePercent = usagePercent;
         launchArgs.mPackageName = diffEntry.getPackageName();
         launchArgs.mAppLabel = diffEntry.getAppLabel();
+        launchArgs.mSlotInformation = slotInformation;
         launchArgs.mUid = (int) histEntry.mUid;
         launchArgs.mIconId = diffEntry.getAppIconId();
         launchArgs.mConsumedPower = (int) diffEntry.mConsumePower;
-        launchArgs.mForegroundTimeMs = diffEntry.mForegroundUsageTimeInMs;
-        launchArgs.mBackgroundTimeMs = diffEntry.mBackgroundUsageTimeInMs;
+        launchArgs.mForegroundTimeMs =
+            isValidToShowSummary ? diffEntry.mForegroundUsageTimeInMs : 0;
+        launchArgs.mBackgroundTimeMs =
+            isValidToShowSummary ? diffEntry.mBackgroundUsageTimeInMs : 0;
         launchArgs.mIsUserEntry = histEntry.isUserEntry();
         startBatteryDetailPage(caller, fragment, launchArgs);
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index ff74477..99e6b0d 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -151,21 +151,22 @@
         final PowerGaugePreference powerPref = (PowerGaugePreference) preference;
         final BatteryDiffEntry diffEntry = powerPref.getBatteryDiffEntry();
         final BatteryHistEntry histEntry = diffEntry.mBatteryHistEntry;
+        final String packageName = histEntry.mPackageName;
         // Checks whether the package is installed or not.
         boolean isValidPackage = true;
         if (histEntry.isAppEntry()) {
             if (mBatteryUtils == null) {
                 mBatteryUtils = BatteryUtils.getInstance(mPrefContext);
             }
-            isValidPackage = mBatteryUtils.getPackageUid(histEntry.mPackageName)
+            isValidPackage = mBatteryUtils.getPackageUid(packageName)
                 != BatteryUtils.UID_NULL;
         }
         Log.d(TAG, String.format("handleClick() label=%s key=%s isValid:%b %s",
-            diffEntry.getAppLabel(), histEntry.getKey(), isValidPackage,
-            histEntry.mPackageName));
+            diffEntry.getAppLabel(), histEntry.getKey(), isValidPackage, packageName));
         if (isValidPackage) {
             AdvancedPowerUsageDetail.startBatteryDetailPage(
-                mActivity, mFragment, diffEntry, powerPref.getPercent());
+                mActivity, mFragment, diffEntry, powerPref.getPercent(),
+                isValidToShowSummary(packageName), getSlotInformation());
             return true;
         }
         return false;
@@ -267,8 +268,8 @@
                 || (mTrapezoidIndex == trapezoidIndex && !isForce)) {
             return false;
         }
-        Log.d(TAG, String.format("refreshUi: index=%d batteryIndexedMap.size=%d",
-            mTrapezoidIndex, mBatteryIndexedMap.size()));
+        Log.d(TAG, String.format("refreshUi: index=%d size=%d isForce:%b",
+            trapezoidIndex, mBatteryIndexedMap.size(), isForce));
 
         mTrapezoidIndex = trapezoidIndex;
         mHandler.post(() -> {
@@ -471,11 +472,9 @@
         final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
         final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
         // Checks whether the package is allowed to show summary or not.
-        for (CharSequence notAllowPackageName : mNotAllowShowSummaryPackages) {
-            if (TextUtils.equals(entry.getPackageName(), notAllowPackageName)) {
-                preference.setSummary(null);
-                return;
-            }
+        if (!isValidToShowSummary(entry.getPackageName())) {
+            preference.setSummary(null);
+            return;
         }
         String usageTimeSummary = null;
         // Not shows summary for some system components without usage time.
@@ -515,6 +514,17 @@
         return mPrefContext.getString(resourceId, timeSequence);
     }
 
+    private boolean isValidToShowSummary(String packageName) {
+        if (mNotAllowShowSummaryPackages != null) {
+            for (CharSequence notAllowPackageName : mNotAllowShowSummaryPackages) {
+                if (TextUtils.equals(packageName, notAllowPackageName)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
     private static String utcToLocalTime(long[] timestamps) {
         final StringBuilder builder = new StringBuilder();
         for (int index = 0; index < timestamps.length; index++) {
diff --git a/src/com/android/settings/fuelgauge/ExpandDividerPreference.java b/src/com/android/settings/fuelgauge/ExpandDividerPreference.java
index 40536eb..b89f2d4 100644
--- a/src/com/android/settings/fuelgauge/ExpandDividerPreference.java
+++ b/src/com/android/settings/fuelgauge/ExpandDividerPreference.java
@@ -38,6 +38,7 @@
     private OnExpandListener mOnExpandListener;
 
     private boolean mIsExpanded = false;
+    private String mTitleContent = null;
 
     /** A callback listener for expand state is changed by users. */
     public interface OnExpandListener {
@@ -72,6 +73,7 @@
     }
 
     void setTitle(final String titleContent) {
+        mTitleContent = titleContent;
         if (mTextView != null) {
             mTextView.postDelayed(
                 () -> mTextView.setText(titleContent), 50);
@@ -95,5 +97,6 @@
         if (mImageView != null) {
             mImageView.setImageResource(iconId);
         }
+        setTitle(mTitleContent);
     }
 }
