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
This commit is contained in:
ykhung
2021-05-21 14:45:28 +08:00
committed by YUKAI HUNG
parent 417af889e1
commit e030d8613a
3 changed files with 33 additions and 1 deletions

View File

@@ -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 -->

View File

@@ -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"/>

View File

@@ -48,6 +48,7 @@ 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.Arrays;
import java.util.ArrayList;
@@ -62,6 +63,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
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 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
@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 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
@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 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
mBatteryIndexedMap = null;
mBatteryHistoryKeys = null;
mBatteryHistoryLevels = null;
addFooterPreferenceIfNeeded(false);
return;
}
mBatteryHistoryKeys = getBatteryHistoryKeys(batteryHistoryMap);
@@ -347,6 +361,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
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 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
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++) {