Fix footer preference may flash one time when entering

new solution > We will not show the footer preference in the beginning when users entering the app, it will wait until the data is loaded to show the footer and app item in the same time. We also enhance the footer message as "Battery usage data will be available after you use your phone for a few hours" when there are not content in the begining.

Bug: 187766862
Bug: 188871770
Test: make SettingsRoboTests
Change-Id: I8d19173b4402722797b1ae3c4cfe6dcdf2d3fe3f
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1c5f833..8141192 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6497,8 +6497,10 @@
     <string name="battery_usage_for_total_time">Total: <xliff:g id="time">%s</xliff:g></string>
     <!-- [CHAR_LIMIT=NONE] Battery usage item for background usage time -->
     <string name="battery_usage_for_background_time">Background: <xliff:g id="time">%s</xliff:g></string>
-    <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer contentt -->
+    <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer content -->
     <string name="battery_usage_screen_footer">Battery usage data is approximate and doesn\'t measure usage when phone is charging</string>
+    <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer for empty content -->
+    <string name="battery_usage_screen_footer_empty">Battery usage data will be available after you use your phone for a few hours</string>
     <!-- [CHAR_LIMIT=NONE] Accessibility content description for battery chart view. -->
     <string name="battery_usage_chart">Battery usage chart</string>
     <!-- Process Stats strings -->
diff --git a/res/xml/power_usage_advanced.xml b/res/xml/power_usage_advanced.xml
index 67f1783..7a9c44b 100644
--- a/res/xml/power_usage_advanced.xml
+++ b/res/xml/power_usage_advanced.xml
@@ -28,6 +28,7 @@
         android:key="app_list"/>
 
     <com.android.settingslib.widget.FooterPreference
+        android:key="battery_graph_footer"
         android:title="@string/battery_usage_screen_footer"
         android:selectable="false"
         settings:searchable="false"/>
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index 2ac55e7..a36c2ef 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -48,6 +48,7 @@
 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.Arrays;
 import java.util.ArrayList;
@@ -62,6 +63,9 @@
                 OnSaveInstanceState, BatteryChartView.OnSelectListener, OnResume,
                 ExpandDividerPreference.OnExpandListener {
     private static final String TAG = "BatteryChartPreferenceController";
+    private static final String KEY_FOOTER_PREF = "battery_graph_footer";
+    private static final int ADD_FOOTER_DELAYED_MS = 250;
+
     /** Desired battery history size for timestamp slots. */
     public static final int DESIRED_HISTORY_SIZE = 25;
     private static final int CHART_LEVEL_ARRAY_SIZE = 13;
@@ -90,6 +94,9 @@
     @VisibleForTesting int mTrapezoidIndex = BatteryChartView.SELECTED_INDEX_INVALID;
 
     private boolean mIs24HourFormat = false;
+    private boolean mIsFooterPrefAdded = false;
+    private PreferenceScreen mPreferenceScreen;
+    private FooterPreference mFooterPreference;
 
     private final String mPreferenceKey;
     private final SettingsActivity mActivity;
@@ -178,9 +185,15 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
+        mPreferenceScreen = screen;
         mPrefContext = screen.getContext();
         mAppListPrefGroup = screen.findPreference(mPreferenceKey);
         mAppListPrefGroup.setOrderingAsAdded(false);
+        mFooterPreference = screen.findPreference(KEY_FOOTER_PREF);
+        // Removes footer first until usage data is loaded to avoid flashing.
+        if (mFooterPreference != null) {
+            screen.removePreference(mFooterPreference);
+        }
     }
 
     @Override
@@ -264,6 +277,7 @@
             mBatteryIndexedMap = null;
             mBatteryHistoryKeys = null;
             mBatteryHistoryLevels = null;
+            addFooterPreferenceIfNeeded(false);
             return;
         }
         mBatteryHistoryKeys = getBatteryHistoryKeys(batteryHistoryMap);
@@ -347,6 +361,7 @@
     private void addAllPreferences() {
         final List<BatteryDiffEntry> entries =
             mBatteryIndexedMap.get(Integer.valueOf(mTrapezoidIndex));
+        addFooterPreferenceIfNeeded(!entries.isEmpty());
         if (entries == null) {
             Log.w(TAG, "cannot find BatteryDiffEntry for:" + mTrapezoidIndex);
             return;
@@ -575,6 +590,20 @@
         mBatteryChartView.setLatestTimestamp(latestTimestamp);
     }
 
+    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.postDelayed(
+            () -> mPreferenceScreen.addPreference(mFooterPreference),
+            ADD_FOOTER_DELAYED_MS);
+    }
+
     private static String utcToLocalTime(long[] timestamps) {
         final StringBuilder builder = new StringBuilder();
         for (int index = 0; index < timestamps.length; index++) {