diff --git a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java index 087d4f919b6..0b0dbfdee62 100644 --- a/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppBatteryPreferenceController.java @@ -40,7 +40,7 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.fuelgauge.AdvancedPowerUsageDetail; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; -import com.android.settings.fuelgauge.batteryusage.BatteryChartPreferenceController; +import com.android.settings.fuelgauge.batteryusage.BatteryChartPreferenceControllerV2; import com.android.settings.fuelgauge.batteryusage.BatteryDiffEntry; import com.android.settings.fuelgauge.batteryusage.BatteryEntry; import com.android.settings.fuelgauge.batteryusage.BatteryUsageStatsLoader; @@ -179,7 +179,7 @@ public class AppBatteryPreferenceController extends BasePreferenceController return null; } final BatteryDiffEntry entry = - BatteryChartPreferenceController.getBatteryLast24HrUsageData( + BatteryChartPreferenceControllerV2.getAppBatteryUsageData( mContext, mPackageName, mUserId); Log.d(TAG, "loadBatteryDiffEntries():\n" + entry); return entry; diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java index 84b90c34c87..4e533815739 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java @@ -54,7 +54,6 @@ import com.android.settingslib.utils.StringUtil; import com.android.settingslib.widget.FooterPreference; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -595,7 +594,7 @@ public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceContro @VisibleForTesting boolean isValidToShowSummary(String packageName) { - return !contains(packageName, mNotAllowShowSummaryPackages); + return !DataProcessor.contains(packageName, mNotAllowShowSummaryPackages); } private void addFooterPreferenceIfNeeded(boolean containAppItems) { @@ -639,59 +638,36 @@ public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceContro return texts; } - private static boolean contains(String target, CharSequence[] packageNames) { - if (target != null && packageNames != null) { - for (CharSequence packageName : packageNames) { - if (TextUtils.equals(target, packageName)) { - return true; - } - } - } - return false; - } - - // TODO: Change this method to fromLastFullCharged. - /** Used for {@link AppBatteryPreferenceController}. */ - public static List getBatteryLast24HrUsageData(Context context) { + public static List getAppBatteryUsageData(Context context) { final long start = System.currentTimeMillis(); final Map> batteryHistoryMap = FeatureFactory.getFactory(context) .getPowerUsageFeatureProvider(context) - .getBatteryHistory(context); + .getBatteryHistorySinceLastFullCharge(context); if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) { return null; } - Log.d(TAG, String.format("getBatteryLast24HrData() size=%d time=%d/ms", + Log.d(TAG, String.format("getBatterySinceLastFullChargeUsageData() size=%d time=%d/ms", batteryHistoryMap.size(), (System.currentTimeMillis() - start))); - final List batteryHistoryKeyList = - new ArrayList<>(batteryHistoryMap.keySet()); - Collections.sort(batteryHistoryKeyList); - final long[] batteryHistoryKeys = new long[TWENTY_FOUR_HOURS_TIME_SLOT_SIZE + 1]; - for (int index = 0; index < batteryHistoryKeys.length; index++) { - batteryHistoryKeys[index] = batteryHistoryKeyList.get(index); - } - - final Map> batteryIndexedMap = - ConvertUtils.getIndexedUsageMap( - context, - /*timeSlotSize=*/ TWENTY_FOUR_HOURS_TIME_SLOT_SIZE, - batteryHistoryKeys, - batteryHistoryMap, - /*purgeLowPercentageAndFakeData=*/ true); - return batteryIndexedMap.get(BatteryChartViewModel.SELECTED_INDEX_ALL); + final Map> batteryUsageData = + DataProcessor.getBatteryUsageData(context, batteryHistoryMap); + return batteryUsageData == null + ? null + : batteryUsageData + .get(BatteryChartViewModel.SELECTED_INDEX_ALL) + .get(BatteryChartViewModel.SELECTED_INDEX_ALL) + .getAppDiffEntryList(); } - // TODO: Change this method to fromLastFullCharged. - /** Used for {@link AppBatteryPreferenceController}. */ - public static BatteryDiffEntry getBatteryLast24HrUsageData( + public static BatteryDiffEntry getAppBatteryUsageData( Context context, String packageName, int userId) { if (packageName == null) { return null; } - final List entries = getBatteryLast24HrUsageData(context); + final List entries = getAppBatteryUsageData(context); if (entries == null) { return null; } diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java index a51fbec73c1..aadac8ed666 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java @@ -58,6 +58,7 @@ public final class DataProcessor { private static final String TAG = "DataProcessor"; private static final int MIN_DAILY_DATA_SIZE = 2; private static final int MIN_TIMESTAMP_DATA_SIZE = 2; + private static final int MAX_DIFF_SECONDS_OF_UPPER_TIMESTAMP = 5; // Maximum total time value for each hourly slot cumulative data at most 2 hours. private static final float TOTAL_HOURLY_TIME_THRESHOLD = DateUtils.HOUR_IN_MILLIS * 2; private static final Map EMPTY_BATTERY_MAP = new HashMap<>(); @@ -118,6 +119,30 @@ public final class DataProcessor { return batteryLevelData; } + /** + * @return Returns battery usage data of different entries. + * Returns null if the input is invalid or there is no enough data. + */ + @Nullable + public static Map> getBatteryUsageData( + Context context, + @Nullable final Map> batteryHistoryMap) { + if (batteryHistoryMap == null || batteryHistoryMap.isEmpty()) { + Log.d(TAG, "getBatteryLevelData() returns null"); + return null; + } + // Process raw history map data into hourly timestamps. + final Map> processedBatteryHistoryMap = + getHistoryMapWithExpectedTimestamps(context, batteryHistoryMap); + // Wrap and processed history map into easy-to-use format for UI rendering. + final BatteryLevelData batteryLevelData = + getLevelDataThroughProcessedHistoryMap(context, processedBatteryHistoryMap); + return getBatteryUsageMap( + context, + batteryLevelData.getHourlyBatteryLevelsPerDay(), + processedBatteryHistoryMap); + } + /** * @return Returns whether the target is in the CharSequence array. */ @@ -386,7 +411,8 @@ public final class DataProcessor { return; } // Case 2: upper timestamp is closed to the current timestamp. - if ((upperTimestamp - currentSlot) < 5 * DateUtils.SECOND_IN_MILLIS) { + if ((upperTimestamp - currentSlot) + < MAX_DIFF_SECONDS_OF_UPPER_TIMESTAMP * DateUtils.SECOND_IN_MILLIS) { log(context, "force align into the nearest slot", currentSlot, null); resultMap.put(currentSlot, batteryHistoryMap.get(upperTimestamp)); return;