Merge "Display the chart levels data into BatteryHistoryPreference" into sc-dev

This commit is contained in:
YUKAI HUNG
2021-04-10 22:32:27 +00:00
committed by Android (Google) Code Review
5 changed files with 136 additions and 15 deletions

View File

@@ -20,6 +20,7 @@ package com.android.settings.fuelgauge;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -34,24 +35,48 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnDestroy;
import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnPause;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/** Cotrols the update for chart graph and the list items. */ /** Controls the update for chart graph and the list items. */
public class BatteryChartPreferenceController extends AbstractPreferenceController public class BatteryChartPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnDestroy { implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnDestroy,
BatteryChartView.OnSelectListener {
private static final String TAG = "BatteryChartPreferenceController"; private static final String TAG = "BatteryChartPreferenceController";
private static final int CHART_KEY_ARRAY_SIZE = 25;
private static final int CHART_LEVEL_ARRAY_SIZE = 13;
@VisibleForTesting
PreferenceGroup mAppListGroup;
private Context mPrefContext;
private BatteryChartView mBatteryChartView;
// Battery history relative data.
private int[] mBatteryHistoryLevels;
private long[] mBatteryHistoryKeys;
private Map<Long, List<BatteryHistEntry>> mBatteryHistoryMap;
private int mTrapezoidIndex = BatteryChartView.SELECTED_INDEX_INVALID;
private final String mPreferenceKey; private final String mPreferenceKey;
private final SettingsActivity mActivity;
private final InstrumentedPreferenceFragment mFragment;
public BatteryChartPreferenceController( public BatteryChartPreferenceController(
Context context, String chartPreferenceKey, String listPreferenceKey, Context context, String preferenceKey,
Lifecycle lifecycle, SettingsActivity activity, Lifecycle lifecycle, SettingsActivity activity,
InstrumentedPreferenceFragment fragment) { InstrumentedPreferenceFragment fragment) {
super(context); super(context);
mPreferenceKey = listPreferenceKey; mActivity = activity;
mFragment = fragment;
mPreferenceKey = preferenceKey;
if (lifecycle != null) {
lifecycle.addObserver(this);
}
} }
@Override @Override
public void onPause() { public void onPause() {
@@ -63,6 +88,9 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPrefContext = screen.getContext();
mAppListGroup = screen.findPreference(mPreferenceKey);
} }
@Override @Override
@@ -80,7 +108,73 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
return false; return false;
} }
void refreshUi(Map<Long, List<BatteryHistEntry>> batteryHistoryMap) { @Override
Log.d(TAG, "refreshUi:" + batteryHistoryMap.size()); public void onSelect(int trapezoidIndex) {
Log.d(TAG, "onSelect:" + trapezoidIndex);
refreshUi(trapezoidIndex);
}
void setBatteryHistoryMap(Map<Long, List<BatteryHistEntry>> batteryHistoryMap) {
// Assumes all timestamp data is consecutive and aligns to hourly time slot.
mBatteryHistoryMap = batteryHistoryMap;
// Generates battery history keys.
final List<Long> batteryHistoryKeyList =
new ArrayList<Long>(mBatteryHistoryMap.keySet());
// Sorts all timestamp keys ordered by ASC from the map keys.
Collections.sort(batteryHistoryKeyList);
mBatteryHistoryKeys = new long[CHART_KEY_ARRAY_SIZE];
final int elementSize = Math.min(
batteryHistoryKeyList.size(), CHART_KEY_ARRAY_SIZE);
final int offset = CHART_KEY_ARRAY_SIZE - elementSize;
for (int index = 0; index < elementSize; index++) {
mBatteryHistoryKeys[index + offset] = batteryHistoryKeyList.get(index);
}
// Generates the battery history levels.
mBatteryHistoryLevels = new int[CHART_LEVEL_ARRAY_SIZE];
for (int index = 0; index < CHART_LEVEL_ARRAY_SIZE; index++) {
final Long timestamp = Long.valueOf(mBatteryHistoryKeys[index * 2]);
final List<BatteryHistEntry> entryList = mBatteryHistoryMap.get(timestamp);
if (entryList != null && !entryList.isEmpty()) {
// All battery levels are the same in the same timestamp snapshot.
mBatteryHistoryLevels[index] = entryList.get(0).mBatteryLevel;
} else {
Log.w(TAG, "abnormal entry list in the timestamp:" + timestamp);
}
}
if (mBatteryChartView != null) {
mBatteryChartView.setLevels(mBatteryHistoryLevels);
}
Log.d(TAG, String.format("setBatteryHistoryMap() size=%d\nkeys=%s\nlevels=%s",
batteryHistoryKeyList.size(),
utcToLocalTime(mBatteryHistoryKeys),
Arrays.toString(mBatteryHistoryLevels)));
}
void setBatteryChartView(BatteryChartView batteryChartView) {
mBatteryChartView = batteryChartView;
mBatteryChartView.setOnSelectListener(this);
if (mBatteryHistoryLevels != null) {
mBatteryChartView.setLevels(mBatteryHistoryLevels);
}
}
private void refreshUi(int trapezoidIndex) {
// Invalid refresh condition.
if (mBatteryHistoryMap == null || mBatteryChartView == null ||
mTrapezoidIndex == trapezoidIndex) {
return;
}
mTrapezoidIndex = trapezoidIndex;
Log.d(TAG, String.format("refreshUi: index=%d size=%d",
mTrapezoidIndex, mBatteryHistoryMap.size()));
}
private static String utcToLocalTime(long[] timestamps) {
final StringBuilder builder = new StringBuilder();
for (int index = 0; index < timestamps.length; index++) {
builder.append(String.format("%s| ",
ConvertUtils.utcToLocalTime(timestamps[index])));
}
return builder.toString();
} }
} }

View File

@@ -17,12 +17,9 @@ import android.content.ContentValues;
import android.database.Cursor; import android.database.Cursor;
import android.util.Log; import android.util.Log;
import java.text.SimpleDateFormat;
import java.time.Duration; import java.time.Duration;
import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
/** A container class to carry data from {@link ContentValues}. */ /** A container class to carry data from {@link ContentValues}. */
public final class BatteryHistEntry { public final class BatteryHistEntry {
private static final String TAG = "BatteryHistEntry"; private static final String TAG = "BatteryHistEntry";
@@ -117,8 +114,7 @@ public final class BatteryHistEntry {
@Override @Override
public String toString() { public String toString() {
final String recordAtDateTime = final String recordAtDateTime = ConvertUtils.utcToLocalTime(mTimestamp);
new SimpleDateFormat("MMM dd,yyyy HH:mm:ss").format(new Date(mTimestamp));
final StringBuilder builder = new StringBuilder() final StringBuilder builder = new StringBuilder()
.append("\nBatteryHistEntry{") .append("\nBatteryHistEntry{")
.append(String.format("\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b", .append(String.format("\n\tpackage=%s|label=%s|uid=%d|userId=%d|isHidden=%b",

View File

@@ -39,6 +39,9 @@ public class BatteryHistoryPreference extends Preference {
@VisibleForTesting @VisibleForTesting
BatteryInfo mBatteryInfo; BatteryInfo mBatteryInfo;
private BatteryChartView mBatteryChartView;
private BatteryChartPreferenceController mChartPreferenceController;
public BatteryHistoryPreference(Context context, AttributeSet attrs) { public BatteryHistoryPreference(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
final boolean isChartGraphEnabled = final boolean isChartGraphEnabled =
@@ -58,6 +61,13 @@ public class BatteryHistoryPreference extends Preference {
}, batteryUsageStats, false); }, batteryUsageStats, false);
} }
void setChartPreferenceController(BatteryChartPreferenceController controller) {
mChartPreferenceController = controller;
if (mBatteryChartView != null) {
mChartPreferenceController.setBatteryChartView(mBatteryChartView);
}
}
@Override @Override
public void onBindViewHolder(PreferenceViewHolder view) { public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view); super.onBindViewHolder(view);
@@ -65,6 +75,10 @@ public class BatteryHistoryPreference extends Preference {
if (mBatteryInfo == null) { if (mBatteryInfo == null) {
return; return;
} }
mBatteryChartView = (BatteryChartView) view.findViewById(R.id.battery_chart);
if (mChartPreferenceController != null) {
mChartPreferenceController.setBatteryChartView(mBatteryChartView);
}
BatteryUtils.logRuntime(TAG, "onBindViewHolder", startTime); BatteryUtils.logRuntime(TAG, "onBindViewHolder", startTime);
} }
} }

View File

@@ -25,11 +25,16 @@ import android.util.Log;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone; import java.util.TimeZone;
/** A utility class to convert data into another types. */ /** A utility class to convert data into another types. */
public final class ConvertUtils { public final class ConvertUtils {
private static final String TAG = "ConvertUtils"; private static final String TAG = "ConvertUtils";
private static final SimpleDateFormat SIMPLE_DATE_FORMAT =
new SimpleDateFormat("MMM dd,yyyy HH:mm:ss", Locale.ENGLISH);
/** Invalid system battery consumer drain type. */ /** Invalid system battery consumer drain type. */
public static final int INVALID_DRAIN_TYPE = -1; public static final int INVALID_DRAIN_TYPE = -1;
@@ -101,5 +106,10 @@ public final class ConvertUtils {
return values; return values;
} }
/** Converts UTC timestamp to human readable local time string. */
public static String utcToLocalTime(long timestamp) {
return SIMPLE_DATE_FORMAT.format(new Date(timestamp));
}
private ConvertUtils() {} private ConvertUtils() {}
} }

View File

@@ -69,6 +69,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
if (!mIsChartGraphEnabled) { if (!mIsChartGraphEnabled) {
removePreference(KEY_BATTERY_GRAPH); removePreference(KEY_BATTERY_GRAPH);
} }
setBatteryChartPreferenceController();
} }
@Override @Override
@@ -101,10 +102,10 @@ public class PowerUsageAdvanced extends PowerUsageBase {
// Creates based on the chart design is enabled or not. // Creates based on the chart design is enabled or not.
if (mIsChartGraphEnabled) { if (mIsChartGraphEnabled) {
mBatteryChartPreferenceController = mBatteryChartPreferenceController =
new BatteryChartPreferenceController(context, new BatteryChartPreferenceController(context, KEY_APP_LIST,
KEY_BATTERY_GRAPH, KEY_APP_LIST,
getSettingsLifecycle(), (SettingsActivity) getActivity(), this); getSettingsLifecycle(), (SettingsActivity) getActivity(), this);
controllers.add(mBatteryChartPreferenceController); controllers.add(mBatteryChartPreferenceController);
setBatteryChartPreferenceController();
} else { } else {
mBatteryAppListPreferenceController = mBatteryAppListPreferenceController =
new BatteryAppListPreferenceController(context, KEY_APP_LIST, new BatteryAppListPreferenceController(context, KEY_APP_LIST,
@@ -131,7 +132,7 @@ public class PowerUsageAdvanced extends PowerUsageBase {
mBatteryUsageStats, /* showAllApps */true); mBatteryUsageStats, /* showAllApps */true);
} }
if (mBatteryChartPreferenceController != null && mBatteryHistoryMap != null) { if (mBatteryChartPreferenceController != null && mBatteryHistoryMap != null) {
mBatteryChartPreferenceController.refreshUi(mBatteryHistoryMap); mBatteryChartPreferenceController.setBatteryHistoryMap(mBatteryHistoryMap);
} }
} }
@@ -156,6 +157,12 @@ public class PowerUsageAdvanced extends PowerUsageBase {
} }
} }
private void setBatteryChartPreferenceController() {
if (mHistPref != null && mBatteryChartPreferenceController != null) {
mHistPref.setChartPreferenceController(mBatteryChartPreferenceController);
}
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() { new BaseSearchIndexProvider() {
@Override @Override