Loading src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +3 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,9 @@ public interface PowerUsageFeatureProvider { /** Check whether the battery tips card is enabled in the battery usage page */ boolean isBatteryTipsEnabled(); /** Check whether to log the optimization mode of app entry in period job */ boolean isAppOptimizationModeLogged(); /** * Returns a threshold (in milliseconds) for the minimal screen on time in battery usage list */ Loading src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +5 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider return false; } @Override public boolean isAppOptimizationModeLogged() { return false; } @Override public double getBatteryUsageListScreenOnTimeThresholdInMs() { return 0; Loading src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java 0 → 100644 +54 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.fuelgauge.batteryusage; import android.content.Context; import android.util.ArrayMap; import androidx.annotation.VisibleForTesting; import com.android.settings.fuelgauge.BatteryOptimizeUtils; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import java.util.Map; /** A cache to log battery optimization mode of an app */ final class BatteryOptimizationModeCache { private static final String TAG = "BatteryOptimizationModeCache"; @VisibleForTesting final Map<Integer, BatteryOptimizationMode> mBatteryOptimizeModeCacheMap; private final Context mContext; BatteryOptimizationModeCache(final Context context) { mContext = context; mBatteryOptimizeModeCacheMap = new ArrayMap<>(); PowerAllowlistBackend.getInstance(mContext).refreshList(); } BatteryOptimizationMode getBatteryOptimizeMode(final int uid, final String packageName) { if (!mBatteryOptimizeModeCacheMap.containsKey(uid)) { final BatteryOptimizeUtils batteryOptimizeUtils = new BatteryOptimizeUtils(mContext, uid, packageName); mBatteryOptimizeModeCacheMap.put( uid, BatteryOptimizationMode.forNumber( batteryOptimizeUtils.getAppOptimizationMode(/* refreshList= */ false))); } return mBatteryOptimizeModeCacheMap.get(uid); } } src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java +12 −7 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.fuelgauge.BatteryUsageHistoricalLogEntry.Action; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.batteryusage.bugreport.BatteryUsageLogUtils; import com.android.settings.overlay.FeatureFactory; Loading Loading @@ -124,9 +125,15 @@ public final class BatteryUsageDataLoader { userIdsSeries, /* isFromPeriodJob= */ true, batteryDiffDataMap -> { final PowerUsageFeatureProvider featureProvider = FeatureFactory.getFeatureFactory() .getPowerUsageFeatureProvider(); DatabaseUtils.sendBatteryUsageSlotData( context, ConvertUtils.convertToBatteryUsageSlotList(batteryDiffDataMap)); ConvertUtils.convertToBatteryUsageSlotList( context, batteryDiffDataMap, featureProvider.isAppOptimizationModeLogged())); if (batteryDiffDataMap.values().stream() .anyMatch( data -> Loading @@ -135,9 +142,7 @@ public final class BatteryUsageDataLoader { .isEmpty() || !data.getAppDiffEntryList() .isEmpty()))) { FeatureFactory.getFeatureFactory() .getPowerUsageFeatureProvider() .detectPowerAnomaly( featureProvider.detectPowerAnomaly( context, /* displayDrain= */ 0, DetectRequestSourceType.TYPE_DATA_LOADER); Loading src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java +21 −7 Original line number Diff line number Diff line Loading @@ -345,10 +345,15 @@ public final class ConvertUtils { /** Converts from {@link Map<Long, BatteryDiffData>} to {@link List<BatteryUsageSlot>} */ public static List<BatteryUsageSlot> convertToBatteryUsageSlotList( final Map<Long, BatteryDiffData> batteryDiffDataMap) { final Context context, final Map<Long, BatteryDiffData> batteryDiffDataMap, final boolean isAppOptimizationModeLogged) { List<BatteryUsageSlot> batteryUsageSlotList = new ArrayList<>(); final BatteryOptimizationModeCache optimizationModeCache = isAppOptimizationModeLogged ? new BatteryOptimizationModeCache(context) : null; for (BatteryDiffData batteryDiffData : batteryDiffDataMap.values()) { batteryUsageSlotList.add(convertToBatteryUsageSlot(batteryDiffData)); batteryUsageSlotList.add( convertToBatteryUsageSlot(batteryDiffData, optimizationModeCache)); } return batteryUsageSlotList; } Loading Loading @@ -479,9 +484,10 @@ public final class ConvertUtils { } } @VisibleForTesting static BatteryUsageDiff convertToBatteryUsageDiff(BatteryDiffEntry batteryDiffEntry) { static BatteryUsageDiff convertToBatteryUsageDiff( final BatteryDiffEntry batteryDiffEntry, final @Nullable BatteryOptimizationModeCache optimizationModeCache) { BatteryUsageDiff.Builder builder = BatteryUsageDiff.newBuilder() .setUid(batteryDiffEntry.mUid) Loading Loading @@ -511,11 +517,18 @@ public final class ConvertUtils { if (batteryDiffEntry.mLegacyLabel != null) { builder.setLabel(batteryDiffEntry.mLegacyLabel); } // Log the battery optimization mode of AppEntry while converting to batteryUsageSlot. if (optimizationModeCache != null && !batteryDiffEntry.isSystemEntry()) { builder.setAppOptimizationMode( optimizationModeCache.getBatteryOptimizeMode( (int) batteryDiffEntry.mUid, batteryDiffEntry.getPackageName())); } return builder.build(); } private static BatteryUsageSlot convertToBatteryUsageSlot( final BatteryDiffData batteryDiffData) { final BatteryDiffData batteryDiffData, final @Nullable BatteryOptimizationModeCache optimizationModeCache) { if (batteryDiffData == null) { return BatteryUsageSlot.getDefaultInstance(); } Loading @@ -527,10 +540,11 @@ public final class ConvertUtils { .setEndBatteryLevel(batteryDiffData.getEndBatteryLevel()) .setScreenOnTime(batteryDiffData.getScreenOnTime()); for (BatteryDiffEntry batteryDiffEntry : batteryDiffData.getAppDiffEntryList()) { builder.addAppUsage(convertToBatteryUsageDiff(batteryDiffEntry)); builder.addAppUsage(convertToBatteryUsageDiff(batteryDiffEntry, optimizationModeCache)); } for (BatteryDiffEntry batteryDiffEntry : batteryDiffData.getSystemDiffEntryList()) { builder.addSystemUsage(convertToBatteryUsageDiff(batteryDiffEntry)); builder.addSystemUsage( convertToBatteryUsageDiff(batteryDiffEntry, /* optimizationModeCache= */ null)); } return builder.build(); } Loading Loading
src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +3 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,9 @@ public interface PowerUsageFeatureProvider { /** Check whether the battery tips card is enabled in the battery usage page */ boolean isBatteryTipsEnabled(); /** Check whether to log the optimization mode of app entry in period job */ boolean isAppOptimizationModeLogged(); /** * Returns a threshold (in milliseconds) for the minimal screen on time in battery usage list */ Loading
src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +5 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider return false; } @Override public boolean isAppOptimizationModeLogged() { return false; } @Override public double getBatteryUsageListScreenOnTimeThresholdInMs() { return 0; Loading
src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java 0 → 100644 +54 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.fuelgauge.batteryusage; import android.content.Context; import android.util.ArrayMap; import androidx.annotation.VisibleForTesting; import com.android.settings.fuelgauge.BatteryOptimizeUtils; import com.android.settingslib.fuelgauge.PowerAllowlistBackend; import java.util.Map; /** A cache to log battery optimization mode of an app */ final class BatteryOptimizationModeCache { private static final String TAG = "BatteryOptimizationModeCache"; @VisibleForTesting final Map<Integer, BatteryOptimizationMode> mBatteryOptimizeModeCacheMap; private final Context mContext; BatteryOptimizationModeCache(final Context context) { mContext = context; mBatteryOptimizeModeCacheMap = new ArrayMap<>(); PowerAllowlistBackend.getInstance(mContext).refreshList(); } BatteryOptimizationMode getBatteryOptimizeMode(final int uid, final String packageName) { if (!mBatteryOptimizeModeCacheMap.containsKey(uid)) { final BatteryOptimizeUtils batteryOptimizeUtils = new BatteryOptimizeUtils(mContext, uid, packageName); mBatteryOptimizeModeCacheMap.put( uid, BatteryOptimizationMode.forNumber( batteryOptimizeUtils.getAppOptimizationMode(/* refreshList= */ false))); } return mBatteryOptimizeModeCacheMap.get(uid); } }
src/com/android/settings/fuelgauge/batteryusage/BatteryUsageDataLoader.java +12 −7 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settings.fuelgauge.BatteryUsageHistoricalLogEntry.Action; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; import com.android.settings.fuelgauge.batteryusage.bugreport.BatteryUsageLogUtils; import com.android.settings.overlay.FeatureFactory; Loading Loading @@ -124,9 +125,15 @@ public final class BatteryUsageDataLoader { userIdsSeries, /* isFromPeriodJob= */ true, batteryDiffDataMap -> { final PowerUsageFeatureProvider featureProvider = FeatureFactory.getFeatureFactory() .getPowerUsageFeatureProvider(); DatabaseUtils.sendBatteryUsageSlotData( context, ConvertUtils.convertToBatteryUsageSlotList(batteryDiffDataMap)); ConvertUtils.convertToBatteryUsageSlotList( context, batteryDiffDataMap, featureProvider.isAppOptimizationModeLogged())); if (batteryDiffDataMap.values().stream() .anyMatch( data -> Loading @@ -135,9 +142,7 @@ public final class BatteryUsageDataLoader { .isEmpty() || !data.getAppDiffEntryList() .isEmpty()))) { FeatureFactory.getFeatureFactory() .getPowerUsageFeatureProvider() .detectPowerAnomaly( featureProvider.detectPowerAnomaly( context, /* displayDrain= */ 0, DetectRequestSourceType.TYPE_DATA_LOADER); Loading
src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java +21 −7 Original line number Diff line number Diff line Loading @@ -345,10 +345,15 @@ public final class ConvertUtils { /** Converts from {@link Map<Long, BatteryDiffData>} to {@link List<BatteryUsageSlot>} */ public static List<BatteryUsageSlot> convertToBatteryUsageSlotList( final Map<Long, BatteryDiffData> batteryDiffDataMap) { final Context context, final Map<Long, BatteryDiffData> batteryDiffDataMap, final boolean isAppOptimizationModeLogged) { List<BatteryUsageSlot> batteryUsageSlotList = new ArrayList<>(); final BatteryOptimizationModeCache optimizationModeCache = isAppOptimizationModeLogged ? new BatteryOptimizationModeCache(context) : null; for (BatteryDiffData batteryDiffData : batteryDiffDataMap.values()) { batteryUsageSlotList.add(convertToBatteryUsageSlot(batteryDiffData)); batteryUsageSlotList.add( convertToBatteryUsageSlot(batteryDiffData, optimizationModeCache)); } return batteryUsageSlotList; } Loading Loading @@ -479,9 +484,10 @@ public final class ConvertUtils { } } @VisibleForTesting static BatteryUsageDiff convertToBatteryUsageDiff(BatteryDiffEntry batteryDiffEntry) { static BatteryUsageDiff convertToBatteryUsageDiff( final BatteryDiffEntry batteryDiffEntry, final @Nullable BatteryOptimizationModeCache optimizationModeCache) { BatteryUsageDiff.Builder builder = BatteryUsageDiff.newBuilder() .setUid(batteryDiffEntry.mUid) Loading Loading @@ -511,11 +517,18 @@ public final class ConvertUtils { if (batteryDiffEntry.mLegacyLabel != null) { builder.setLabel(batteryDiffEntry.mLegacyLabel); } // Log the battery optimization mode of AppEntry while converting to batteryUsageSlot. if (optimizationModeCache != null && !batteryDiffEntry.isSystemEntry()) { builder.setAppOptimizationMode( optimizationModeCache.getBatteryOptimizeMode( (int) batteryDiffEntry.mUid, batteryDiffEntry.getPackageName())); } return builder.build(); } private static BatteryUsageSlot convertToBatteryUsageSlot( final BatteryDiffData batteryDiffData) { final BatteryDiffData batteryDiffData, final @Nullable BatteryOptimizationModeCache optimizationModeCache) { if (batteryDiffData == null) { return BatteryUsageSlot.getDefaultInstance(); } Loading @@ -527,10 +540,11 @@ public final class ConvertUtils { .setEndBatteryLevel(batteryDiffData.getEndBatteryLevel()) .setScreenOnTime(batteryDiffData.getScreenOnTime()); for (BatteryDiffEntry batteryDiffEntry : batteryDiffData.getAppDiffEntryList()) { builder.addAppUsage(convertToBatteryUsageDiff(batteryDiffEntry)); builder.addAppUsage(convertToBatteryUsageDiff(batteryDiffEntry, optimizationModeCache)); } for (BatteryDiffEntry batteryDiffEntry : batteryDiffData.getSystemDiffEntryList()) { builder.addSystemUsage(convertToBatteryUsageDiff(batteryDiffEntry)); builder.addSystemUsage( convertToBatteryUsageDiff(batteryDiffEntry, /* optimizationModeCache= */ null)); } return builder.build(); } Loading