diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
index e7a18d0..d686594 100644
--- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
@@ -39,10 +39,12 @@
     private static final String TAG = "TopLvBatteryPrefControl";
 
     @VisibleForTesting
-    protected boolean mIsBatteryPresent = true;
-    @VisibleForTesting
     Preference mPreference;
+    @VisibleForTesting
+    protected boolean mIsBatteryPresent = true;
+
     private final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
+
     private BatteryInfo mBatteryInfo;
     private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
     private String mBatteryStatusLabel;
@@ -56,8 +58,11 @@
                 mIsBatteryPresent = false;
             }
             BatteryInfo.getBatteryInfo(mContext, info -> {
+                Log.d(TAG, "getBatteryInfo: " + info);
                 mBatteryInfo = info;
                 updateState(mPreference);
+                // Update the preference summary text to the latest state.
+                setSummaryAsync(info);
             }, true /* shortString */);
         });
 
@@ -105,18 +110,19 @@
         if (info == null || context == null) {
             return null;
         }
-
-        Log.d(TAG, "getDashboardLabel: batteryStatusUpdate=" + batteryStatusUpdate);
+        Log.d(TAG, "getDashboardLabel: " + mBatteryStatusLabel + " batteryStatusUpdate="
+                + batteryStatusUpdate);
 
         if (batteryStatusUpdate) {
             setSummaryAsync(info);
         }
-
-        return (mBatteryStatusLabel == null) ? generateLabel(info) : mBatteryStatusLabel;
+        return mBatteryStatusLabel == null ? generateLabel(info) : mBatteryStatusLabel;
     }
 
     private void setSummaryAsync(BatteryInfo info) {
         ThreadUtils.postOnBackgroundThread(() -> {
+            // Return false if built-in status should be used, will use updateBatteryStatus()
+            // method to inject the customized battery status label.
             final boolean triggerBatteryStatusUpdate =
                     mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info);
             ThreadUtils.postOnMainThread(() -> {
@@ -124,14 +130,14 @@
                     mBatteryStatusLabel = null; // will generateLabel()
                 }
                 mPreference.setSummary(
-                        (mBatteryStatusLabel == null) ? generateLabel(info) : mBatteryStatusLabel);
+                        mBatteryStatusLabel == null ? generateLabel(info) : mBatteryStatusLabel);
             });
         });
     }
 
     private CharSequence generateLabel(BatteryInfo info) {
         if (Utils.containsIncompatibleChargers(mContext, TAG)) {
-            return mContext.getString(R.string.battery_tip_incompatible_charging_title);
+            return mContext.getString(R.string.battery_info_status_not_charging);
         }
         if (!info.discharging && info.chargeLabel != null) {
             return info.chargeLabel;
@@ -150,13 +156,13 @@
     @Override
     public void updateBatteryStatus(String label, BatteryInfo info) {
         mBatteryStatusLabel = label; // Null if adaptive charging is not active
-
-        if (mPreference != null) {
-            // Do not triggerBatteryStatusUpdate(), otherwise there will be an infinite loop
-            final CharSequence summary = getSummary(false /* batteryStatusUpdate */);
-            if (summary != null) {
-                mPreference.setSummary(summary);
-            }
+        if (mPreference == null) {
+            return;
+        }
+        // Do not triggerBatteryStatusUpdate() here to cause infinite loop
+        final CharSequence summary = getSummary(false /* batteryStatusUpdate */);
+        if (summary != null) {
+            mPreference.setSummary(summary);
         }
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 55fe8b8..5f825ae 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -141,7 +141,7 @@
         BatteryInfo info = new BatteryInfo();
 
         assertThat(mController.getDashboardLabel(mContext, info, true))
-                .isEqualTo(mContext.getString(R.string.battery_tip_incompatible_charging_title));
+                .isEqualTo(mContext.getString(R.string.battery_info_status_not_charging));
     }
 
     @Test
