Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 287a40a9 authored by Kuan Wang's avatar Kuan Wang
Browse files

Add DataProcessor to process raw history map for UI.

- Move interpolation from DatabaseUtil
- Add the logic to wrap processed history map to BatteryLevelData
- Change ImmutableList to List in BatteryLevelData because
  ImmutableList.of doesn't support null element.

Bug: 236101687
Test: make RunSettingsRoboTests
Change-Id: I0a842f24e5481faf65f667c08a4fdc11fe2f235c
parent 755d6911
Loading
Loading
Loading
Loading
+34 −26
Original line number Original line Diff line number Diff line
@@ -16,58 +16,66 @@


package com.android.settings.fuelgauge.batteryusage;
package com.android.settings.fuelgauge.batteryusage;


import android.util.Log;
import androidx.annotation.NonNull;

import androidx.core.util.Preconditions;
import com.google.common.collect.ImmutableList;


import java.util.List;
import java.util.List;


/** Wraps the battery timestamp and level data used for battery usage chart. */
/** Wraps the battery timestamp and level data used for battery usage chart. */
public final class BatteryLevelData {
public final class BatteryLevelData {

    /** A container for the battery timestamp and level data. */
    /** A container for the battery timestamp and level data. */
    public static final class PeriodBatteryLevelData {
    public static final class PeriodBatteryLevelData {
        private static final String TAG = "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 ImmutableList<Long> mTimestamps;
        private final List<Long> mTimestamps;
        private final ImmutableList<Integer> mLevels;
        private final List<Integer> mLevels;


        public PeriodBatteryLevelData(List<Long> timestamps, List<Integer> levels) {
        public PeriodBatteryLevelData(
            if (timestamps.size() != levels.size()) {
                @NonNull List<Long> timestamps, @NonNull List<Integer> levels) {
                Log.e(TAG, "Different sizes of timestamps and levels. Timestamp: "
            Preconditions.checkArgument(timestamps.size() == levels.size(),
                        + timestamps.size() + ", Level: " + levels.size());
                    /* errorMessage= */ "Timestamp: " + timestamps.size() + ", Level: "
                mTimestamps = ImmutableList.of();
                            + levels.size());
                mLevels = ImmutableList.of();
            mTimestamps = timestamps;
                return;
            mLevels = levels;
            }
            mTimestamps = ImmutableList.copyOf(timestamps);
            mLevels = ImmutableList.copyOf(levels);
        }
        }


        public ImmutableList<Long> getTimestamps() {
        public List<Long> getTimestamps() {
            return mTimestamps;
            return mTimestamps;
        }
        }


        public ImmutableList<Integer> getLevels() {
        public List<Integer> getLevels() {
            return mLevels;
            return mLevels;
        }
        }
    }
    }


    /**
     * There could be 2 cases for the daily battery levels:
     * 1) length is 2: The usage data is within 1 day. Only contains start and end data, such as
     *    data of 2022-01-01 06:00 and 2022-01-01 16:00.
     * 2) length > 2: The usage data is more than 1 days. The data should be the start, end and 0am
     *    data of every day between the start and end, such as data of 2022-01-01 06:00,
     *    2022-01-02 00:00, 2022-01-03 00:00 and 2022-01-03 08:00.
     */
    private final PeriodBatteryLevelData mDailyBatteryLevels;
    private final PeriodBatteryLevelData mDailyBatteryLevels;
    private final ImmutableList<PeriodBatteryLevelData> mHourlyBatteryLevelsPerDay;
    // The size of hourly data must be the size of daily data - 1.
    private final List<PeriodBatteryLevelData> mHourlyBatteryLevelsPerDay;


    public BatteryLevelData(
    public BatteryLevelData(
            PeriodBatteryLevelData dailyBatteryLevels,
            @NonNull PeriodBatteryLevelData dailyBatteryLevels,
            List<PeriodBatteryLevelData> hourlyBatteryLevelsPerDay) {
            @NonNull List<PeriodBatteryLevelData> hourlyBatteryLevelsPerDay) {
        final long dailySize = dailyBatteryLevels.getTimestamps().size();
        final long hourlySize = hourlyBatteryLevelsPerDay.size();
        Preconditions.checkArgument(hourlySize == dailySize - 1,
                /* errorMessage= */ "DailySize: " + dailySize + ", HourlySize: " + hourlySize);
        mDailyBatteryLevels = dailyBatteryLevels;
        mDailyBatteryLevels = dailyBatteryLevels;
        mHourlyBatteryLevelsPerDay = ImmutableList.copyOf(hourlyBatteryLevelsPerDay);
        mHourlyBatteryLevelsPerDay = hourlyBatteryLevelsPerDay;
    }
    }


    public PeriodBatteryLevelData getDailyBatteryLevels() {
    public PeriodBatteryLevelData getDailyBatteryLevels() {
        return mDailyBatteryLevels;
        return mDailyBatteryLevels;
    }
    }


    public ImmutableList<PeriodBatteryLevelData> getHourlyBatteryLevelsPerDay() {
    public List<PeriodBatteryLevelData> getHourlyBatteryLevelsPerDay() {
        return mHourlyBatteryLevelsPerDay;
        return mHourlyBatteryLevelsPerDay;
    }
    }
}
}
 No newline at end of file