Punt battery status action when entering Settings main page

 - Checking battery sharing states at the beging may have some performance issue, post battery status update to background thread to avoid ANR

Bug: 193600924
Test: make SettingsRoboTests
Change-Id: I3b73e6bd4f952bc832783b9b3b5d45db560d088c
diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
index 2eb7cf4..0947938 100644
--- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
@@ -30,6 +30,7 @@
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
+import com.android.settingslib.utils.ThreadUtils;
 
 import java.util.HashMap;
 
@@ -38,8 +39,9 @@
 
     @VisibleForTesting
     protected boolean mIsBatteryPresent = true;
+    @VisibleForTesting
+    Preference mPreference;
     private final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
-    private Preference mPreference;
     private BatteryInfo mBatteryInfo;
     private BatterySettingsFeatureProvider mBatterySettingsFeatureProvider;
     private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
@@ -140,14 +142,26 @@
         }
 
         if (batteryStatusUpdate) {
-            if (!mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info)) {
-                mBatteryStatusLabel = null; // will generateLabel()
-            }
+            setSummaryAsync(info);
         }
 
         return (mBatteryStatusLabel == null) ? generateLabel(info) : mBatteryStatusLabel;
     }
 
+    private void setSummaryAsync(BatteryInfo info) {
+        ThreadUtils.postOnBackgroundThread(() -> {
+            final boolean triggerBatteryStatusUpdate =
+                    mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info);
+            ThreadUtils.postOnMainThread(() -> {
+                if (!triggerBatteryStatusUpdate) {
+                    mBatteryStatusLabel = null; // will generateLabel()
+                }
+                mPreference.setSummary(
+                        (mBatteryStatusLabel == null) ? generateLabel(info) : mBatteryStatusLabel);
+            });
+        });
+    }
+
     private CharSequence generateLabel(BatteryInfo info) {
         if (!info.discharging && info.chargeLabel != null) {
             return info.chargeLabel;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 3201d82..eef6988 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -156,6 +156,7 @@
 
     @Test
     public void getDashboardLabel_returnsCorrectLabel() {
+        mController.mPreference = new Preference(mContext);
         BatteryInfo info = new BatteryInfo();
         info.batteryPercentString = "3%";
         assertThat(mController.getDashboardLabel(mContext, info, true))