Update time format for the first timestamp on usage chartview.

- If usage data start from the time-change event rather than full-charged event
[Before] https://screenshot.googleplex.com/BokAvKHXmt2Mmwn
[After] https://screenshot.googleplex.com/8thpgVrVt8kqo37

Bug: 336423923
Test: atest SettingsRoboTests:com.android.settings.fuelgauge.batteryusage
Change-Id: I66f8b384938f55852e28bd9f50d1a99c7fc9e41b
This commit is contained in:
mxyyiyi
2024-05-08 16:24:01 +08:00
parent f437bec1bc
commit 658bc03d4f
5 changed files with 103 additions and 35 deletions

View File

@@ -649,9 +649,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
private final class HourlyChartLabelTextGenerator extends BaseLabelTextGenerator
implements BatteryChartViewModel.LabelTextGenerator {
private static final int FULL_CHARGE_BATTERY_LEVEL = 100;
private boolean mIsFromFullCharge;
private boolean mIsStartTimestamp;
private long mFistTimestamp;
private long mLatestTimestamp;
@@ -664,7 +662,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
long timestamp = timestamps.get(index);
boolean showMinute = false;
if (Objects.equal(timestamp, mFistTimestamp)) {
if (mIsFromFullCharge) {
if (mIsStartTimestamp) {
showMinute = true;
} else {
// starts from 7 days ago
@@ -699,8 +697,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
@NonNull final BatteryLevelData batteryLevelData) {
BatteryLevelData.PeriodBatteryLevelData firstDayLevelData =
batteryLevelData.getHourlyBatteryLevelsPerDay().get(0);
this.mIsFromFullCharge =
firstDayLevelData.getLevels().get(0) == FULL_CHARGE_BATTERY_LEVEL;
this.mIsStartTimestamp = firstDayLevelData.isStartTimestamp();
this.mFistTimestamp = firstDayLevelData.getTimestamps().get(0);
this.mLatestTimestamp =
getLast(

View File

@@ -28,6 +28,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.core.util.Preconditions;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -39,17 +40,24 @@ public final class BatteryLevelData {
private static final long MIN_SIZE = 2;
private static final long TIME_SLOT = DateUtils.HOUR_IN_MILLIS * 2;
// For testing only.
@VisibleForTesting @Nullable static Calendar sTestCalendar;
/** A container for the battery timestamp and level data. */
public static final class PeriodBatteryLevelData {
// The length of mTimestamps and mLevels must be the same. mLevels[index] might be null when
// there is no level data for the corresponding timestamp.
private final List<Long> mTimestamps;
private final List<Integer> mLevels;
private final boolean mIsStartTimestamp;
public PeriodBatteryLevelData(
@NonNull Map<Long, Integer> batteryLevelMap, @NonNull List<Long> timestamps) {
@NonNull Map<Long, Integer> batteryLevelMap,
@NonNull List<Long> timestamps,
boolean isStartTimestamp) {
mTimestamps = timestamps;
mLevels = new ArrayList<>(timestamps.size());
mIsStartTimestamp = isStartTimestamp;
for (Long timestamp : timestamps) {
mLevels.add(
batteryLevelMap.containsKey(timestamp)
@@ -66,6 +74,10 @@ public final class BatteryLevelData {
return mLevels;
}
public boolean isStartTimestamp() {
return mIsStartTimestamp;
}
@Override
public String toString() {
return String.format(
@@ -105,14 +117,21 @@ public final class BatteryLevelData {
final List<Long> timestampList = new ArrayList<>(batteryLevelMap.keySet());
Collections.sort(timestampList);
final long minTimestamp = timestampList.get(0);
final long sixDaysAgoTimestamp =
DatabaseUtils.getTimestampSixDaysAgo(sTestCalendar != null ? sTestCalendar : null);
final boolean isStartTimestamp = minTimestamp > sixDaysAgoTimestamp;
final List<Long> dailyTimestamps = getDailyTimestamps(timestampList);
final List<List<Long>> hourlyTimestamps = getHourlyTimestamps(dailyTimestamps);
mDailyBatteryLevels = new PeriodBatteryLevelData(batteryLevelMap, dailyTimestamps);
mDailyBatteryLevels =
new PeriodBatteryLevelData(batteryLevelMap, dailyTimestamps, isStartTimestamp);
mHourlyBatteryLevelsPerDay = new ArrayList<>(hourlyTimestamps.size());
for (List<Long> hourlyTimestampsPerDay : hourlyTimestamps) {
for (int i = 0; i < hourlyTimestamps.size(); i++) {
final List<Long> hourlyTimestampsPerDay = hourlyTimestamps.get(i);
mHourlyBatteryLevelsPerDay.add(
new PeriodBatteryLevelData(batteryLevelMap, hourlyTimestampsPerDay));
new PeriodBatteryLevelData(
batteryLevelMap, hourlyTimestampsPerDay, isStartTimestamp && i == 0));
}
}