Loading src/com/android/settings/fuelgauge/BatteryUtils.java +8 −48 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.annotation.WorkerThread; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.internal.util.ArrayUtils; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; Loading Loading @@ -173,22 +172,12 @@ public class BatteryUtils { } /** * Check whether we should hide the battery sipper. * Returns true if the specified battery consumer should be excluded from the summary * battery consumption list. */ public boolean shouldHideSipper(BatterySipper sipper) { final BatterySipper.DrainType drainType = sipper.drainType; return drainType == BatterySipper.DrainType.IDLE || drainType == BatterySipper.DrainType.CELL || drainType == BatterySipper.DrainType.SCREEN || drainType == BatterySipper.DrainType.UNACCOUNTED || drainType == BatterySipper.DrainType.OVERCOUNTED || drainType == BatterySipper.DrainType.BLUETOOTH || drainType == BatterySipper.DrainType.WIFI || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP || mPowerUsageFeatureProvider.isTypeService(sipper) || mPowerUsageFeatureProvider.isTypeSystem(sipper) || isHiddenSystemModule(sipper); public boolean shouldHideUidBatteryConsumer(UidBatteryConsumer consumer) { return shouldHideUidBatteryConsumer(consumer, mPackageManager.getPackagesForUid(consumer.getUid())); } /** Loading Loading @@ -227,17 +216,6 @@ public class BatteryUtils { } } /** * Return {@code true} if one of packages in {@code sipper} is hidden system modules */ public boolean isHiddenSystemModule(BatterySipper sipper) { if (sipper.uidObj == null) { return false; } sipper.mPackages = mPackageManager.getPackagesForUid(sipper.getUid()); return isHiddenSystemModule(sipper.mPackages); } /** * Returns true if one the specified packages belongs to a hidden system module. */ Loading Loading @@ -270,23 +248,6 @@ public class BatteryUtils { return (powerUsageMah / totalPowerMah) * dischargeAmount; } /** * Calculate the whole running time in the state {@code statsType} * * @param batteryStatsHelper utility class that contains the data * @param statsType state that we want to calculate the time for * @return the running time in millis */ public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper, int statsType) { final long elapsedRealtimeUs = PowerUtil.convertMsToUs( SystemClock.elapsedRealtime()); // Return the battery time (millisecond) on status mStatsType return PowerUtil.convertUsToMs( batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType)); } /** * Find the package name for a {@link android.os.BatteryStats.Uid} * Loading Loading @@ -336,14 +297,13 @@ public class BatteryUtils { /** * Calculate the time since last full charge, including the device off time * * @param batteryStatsHelper utility class that contains the data * @param batteryUsageStats class that contains the data * @param currentTimeMs current wall time * @return time in millis */ public long calculateLastFullChargeTime(BatteryStatsHelper batteryStatsHelper, public long calculateLastFullChargeTime(BatteryUsageStats batteryUsageStats, long currentTimeMs) { return currentTimeMs - batteryStatsHelper.getStats().getStartClockTime(); return currentTimeMs - batteryUsageStats.getStatsStartRealtime(); } public static void logRuntime(String tag, String message, long startTime) { Loading src/com/android/settings/fuelgauge/PowerUsageSummary.java +1 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ public class PowerUsageSummary extends PowerUsageBase implements @Override public Loader<List<BatteryTip>> onCreateLoader(int id, Bundle args) { return new BatteryTipLoader(getContext(), mStatsHelper); return new BatteryTipLoader(getContext(), mBatteryUsageStats); } @Override Loading src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +5 −5 Original line number Diff line number Diff line Loading @@ -17,10 +17,10 @@ package com.android.settings.fuelgauge.batterytip; import android.content.Context; import android.os.BatteryUsageStats; import androidx.annotation.VisibleForTesting; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.detectors.BatteryDefenderDetector; Loading Loading @@ -48,13 +48,13 @@ public class BatteryTipLoader extends AsyncLoaderCompat<List<BatteryTip>> { private static final boolean USE_FAKE_DATA = false; private BatteryStatsHelper mBatteryStatsHelper; private BatteryUsageStats mBatteryUsageStats; @VisibleForTesting BatteryUtils mBatteryUtils; public BatteryTipLoader(Context context, BatteryStatsHelper batteryStatsHelper) { public BatteryTipLoader(Context context, BatteryUsageStats batteryUsageStats) { super(context); mBatteryStatsHelper = batteryStatsHelper; mBatteryUsageStats = batteryUsageStats; mBatteryUtils = BatteryUtils.getInstance(context); } Loading @@ -69,7 +69,7 @@ public class BatteryTipLoader extends AsyncLoaderCompat<List<BatteryTip>> { final Context context = getContext(); tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryStatsHelper, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); tips.add(new SmartBatteryDetector(policy, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new BatteryDefenderDetector(batteryInfo).detect()); Loading src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java +21 −25 Original line number Diff line number Diff line Loading @@ -19,12 +19,11 @@ package com.android.settings.fuelgauge.batterytip.detectors; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; import android.content.Context; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.UidBatteryConsumer; import androidx.annotation.VisibleForTesting; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AppInfo; Loading @@ -34,7 +33,6 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; Loading @@ -44,7 +42,7 @@ import java.util.concurrent.TimeUnit; */ public class HighUsageDetector implements BatteryTipDetector { private BatteryTipPolicy mPolicy; private BatteryStatsHelper mBatteryStatsHelper; private BatteryUsageStats mBatteryUsageStats; private final BatteryInfo mBatteryInfo; private List<AppInfo> mHighUsageAppList; @VisibleForTesting Loading @@ -55,9 +53,9 @@ public class HighUsageDetector implements BatteryTipDetector { boolean mDischarging; public HighUsageDetector(Context context, BatteryTipPolicy policy, BatteryStatsHelper batteryStatsHelper, BatteryInfo batteryInfo) { BatteryUsageStats batteryUsageStats, BatteryInfo batteryInfo) { mPolicy = policy; mBatteryStatsHelper = batteryStatsHelper; mBatteryUsageStats = batteryUsageStats; mBatteryInfo = batteryInfo; mHighUsageAppList = new ArrayList<>(); mBatteryUtils = BatteryUtils.getInstance(context); Loading @@ -69,37 +67,35 @@ public class HighUsageDetector implements BatteryTipDetector { @Override public BatteryTip detect() { final long lastFullChargeTimeMs = mBatteryUtils.calculateLastFullChargeTime( mBatteryStatsHelper, System.currentTimeMillis()); mBatteryUsageStats, System.currentTimeMillis()); if (mPolicy.highUsageEnabled && mDischarging) { parseBatteryData(); if (mDataParser.isDeviceHeavilyUsed() || mPolicy.testHighUsageTip) { final BatteryStats batteryStats = mBatteryStatsHelper.getStats(); final List<BatterySipper> batterySippers = new ArrayList<>(mBatteryStatsHelper.getUsageList()); final double totalPower = mBatteryStatsHelper.getTotalPower(); final int dischargeAmount = batteryStats != null ? batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED) : 0; Collections.sort(batterySippers, (sipper1, sipper2) -> Double.compare(sipper2.totalSmearedPowerMah, sipper1.totalSmearedPowerMah)); for (BatterySipper batterySipper : batterySippers) { final double totalPower = mBatteryUsageStats.getConsumedPower(); final int dischargeAmount = mBatteryUsageStats.getDischargePercentage(); final List<UidBatteryConsumer> uidBatteryConsumers = mBatteryUsageStats.getUidBatteryConsumers(); // Sort by descending power uidBatteryConsumers.sort( (consumer1, consumer2) -> Double.compare(consumer2.getConsumedPower(), consumer1.getConsumedPower())); for (UidBatteryConsumer consumer : uidBatteryConsumers) { final double percent = mBatteryUtils.calculateBatteryPercent( batterySipper.totalSmearedPowerMah, totalPower, dischargeAmount); if ((percent + 0.5f < 1f) || mBatteryUtils.shouldHideSipper(batterySipper)) { consumer.getConsumedPower(), totalPower, dischargeAmount); if ((percent + 0.5f < 1f) || mBatteryUtils.shouldHideUidBatteryConsumer(consumer)) { // Don't show it if we should hide or usage percentage is lower than 1% continue; } mHighUsageAppList.add(new AppInfo.Builder() .setUid(batterySipper.getUid()) .setUid(consumer.getUid()) .setPackageName( mBatteryUtils.getPackageName(batterySipper.getUid())) mBatteryUtils.getPackageName(consumer.getUid())) .build()); if (mHighUsageAppList.size() >= mPolicy.highUsageAppCount) { break; } } // When in test mode, add an app if necessary Loading src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +6 −5 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.BatteryUsageStats; import android.util.ArrayMap; import android.view.View; Loading @@ -40,11 +41,10 @@ import androidx.slice.builders.ListBuilder; import androidx.slice.builders.ListBuilder.RowBuilder; import androidx.slice.builders.SliceAction; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.fuelgauge.BatteryStatsHelperLoader; import com.android.settings.fuelgauge.BatteryUsageStatsLoader; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.fuelgauge.batterytip.BatteryTipLoader; import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; Loading Loading @@ -206,9 +206,10 @@ public class BatteryFixSlice implements CustomSliceable { @WorkerThread @VisibleForTesting static List<BatteryTip> refreshBatteryTips(Context context) { final BatteryStatsHelperLoader statsLoader = new BatteryStatsHelperLoader(context); final BatteryStatsHelper statsHelper = statsLoader.loadInBackground(); final BatteryTipLoader loader = new BatteryTipLoader(context, statsHelper); final BatteryUsageStatsLoader statsLoader = new BatteryUsageStatsLoader(context, /* includeBatteryHistory */ false); final BatteryUsageStats batteryUsageStats = statsLoader.loadInBackground(); final BatteryTipLoader loader = new BatteryTipLoader(context, batteryUsageStats); final List<BatteryTip> batteryTips = loader.loadInBackground(); for (BatteryTip batteryTip : batteryTips) { if (batteryTip.getState() != BatteryTip.StateType.INVISIBLE) { Loading Loading
src/com/android/settings/fuelgauge/BatteryUtils.java +8 −48 Original line number Diff line number Diff line Loading @@ -42,7 +42,6 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.annotation.WorkerThread; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.internal.util.ArrayUtils; import com.android.settings.fuelgauge.batterytip.AnomalyDatabaseHelper; Loading Loading @@ -173,22 +172,12 @@ public class BatteryUtils { } /** * Check whether we should hide the battery sipper. * Returns true if the specified battery consumer should be excluded from the summary * battery consumption list. */ public boolean shouldHideSipper(BatterySipper sipper) { final BatterySipper.DrainType drainType = sipper.drainType; return drainType == BatterySipper.DrainType.IDLE || drainType == BatterySipper.DrainType.CELL || drainType == BatterySipper.DrainType.SCREEN || drainType == BatterySipper.DrainType.UNACCOUNTED || drainType == BatterySipper.DrainType.OVERCOUNTED || drainType == BatterySipper.DrainType.BLUETOOTH || drainType == BatterySipper.DrainType.WIFI || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP || mPowerUsageFeatureProvider.isTypeService(sipper) || mPowerUsageFeatureProvider.isTypeSystem(sipper) || isHiddenSystemModule(sipper); public boolean shouldHideUidBatteryConsumer(UidBatteryConsumer consumer) { return shouldHideUidBatteryConsumer(consumer, mPackageManager.getPackagesForUid(consumer.getUid())); } /** Loading Loading @@ -227,17 +216,6 @@ public class BatteryUtils { } } /** * Return {@code true} if one of packages in {@code sipper} is hidden system modules */ public boolean isHiddenSystemModule(BatterySipper sipper) { if (sipper.uidObj == null) { return false; } sipper.mPackages = mPackageManager.getPackagesForUid(sipper.getUid()); return isHiddenSystemModule(sipper.mPackages); } /** * Returns true if one the specified packages belongs to a hidden system module. */ Loading Loading @@ -270,23 +248,6 @@ public class BatteryUtils { return (powerUsageMah / totalPowerMah) * dischargeAmount; } /** * Calculate the whole running time in the state {@code statsType} * * @param batteryStatsHelper utility class that contains the data * @param statsType state that we want to calculate the time for * @return the running time in millis */ public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper, int statsType) { final long elapsedRealtimeUs = PowerUtil.convertMsToUs( SystemClock.elapsedRealtime()); // Return the battery time (millisecond) on status mStatsType return PowerUtil.convertUsToMs( batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType)); } /** * Find the package name for a {@link android.os.BatteryStats.Uid} * Loading Loading @@ -336,14 +297,13 @@ public class BatteryUtils { /** * Calculate the time since last full charge, including the device off time * * @param batteryStatsHelper utility class that contains the data * @param batteryUsageStats class that contains the data * @param currentTimeMs current wall time * @return time in millis */ public long calculateLastFullChargeTime(BatteryStatsHelper batteryStatsHelper, public long calculateLastFullChargeTime(BatteryUsageStats batteryUsageStats, long currentTimeMs) { return currentTimeMs - batteryStatsHelper.getStats().getStartClockTime(); return currentTimeMs - batteryUsageStats.getStatsStartRealtime(); } public static void logRuntime(String tag, String message, long startTime) { Loading
src/com/android/settings/fuelgauge/PowerUsageSummary.java +1 −1 Original line number Diff line number Diff line Loading @@ -108,7 +108,7 @@ public class PowerUsageSummary extends PowerUsageBase implements @Override public Loader<List<BatteryTip>> onCreateLoader(int id, Bundle args) { return new BatteryTipLoader(getContext(), mStatsHelper); return new BatteryTipLoader(getContext(), mBatteryUsageStats); } @Override Loading
src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +5 −5 Original line number Diff line number Diff line Loading @@ -17,10 +17,10 @@ package com.android.settings.fuelgauge.batterytip; import android.content.Context; import android.os.BatteryUsageStats; import androidx.annotation.VisibleForTesting; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.detectors.BatteryDefenderDetector; Loading Loading @@ -48,13 +48,13 @@ public class BatteryTipLoader extends AsyncLoaderCompat<List<BatteryTip>> { private static final boolean USE_FAKE_DATA = false; private BatteryStatsHelper mBatteryStatsHelper; private BatteryUsageStats mBatteryUsageStats; @VisibleForTesting BatteryUtils mBatteryUtils; public BatteryTipLoader(Context context, BatteryStatsHelper batteryStatsHelper) { public BatteryTipLoader(Context context, BatteryUsageStats batteryUsageStats) { super(context); mBatteryStatsHelper = batteryStatsHelper; mBatteryUsageStats = batteryUsageStats; mBatteryUtils = BatteryUtils.getInstance(context); } Loading @@ -69,7 +69,7 @@ public class BatteryTipLoader extends AsyncLoaderCompat<List<BatteryTip>> { final Context context = getContext(); tips.add(new LowBatteryDetector(context, policy, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryStatsHelper, batteryInfo).detect()); tips.add(new HighUsageDetector(context, policy, mBatteryUsageStats, batteryInfo).detect()); tips.add(new SmartBatteryDetector(policy, context.getContentResolver()).detect()); tips.add(new EarlyWarningDetector(policy, context).detect()); tips.add(new BatteryDefenderDetector(batteryInfo).detect()); Loading
src/com/android/settings/fuelgauge/batterytip/detectors/HighUsageDetector.java +21 −25 Original line number Diff line number Diff line Loading @@ -19,12 +19,11 @@ package com.android.settings.fuelgauge.batterytip.detectors; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; import android.content.Context; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.UidBatteryConsumer; import androidx.annotation.VisibleForTesting; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryUtils; import com.android.settings.fuelgauge.batterytip.AppInfo; Loading @@ -34,7 +33,6 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; Loading @@ -44,7 +42,7 @@ import java.util.concurrent.TimeUnit; */ public class HighUsageDetector implements BatteryTipDetector { private BatteryTipPolicy mPolicy; private BatteryStatsHelper mBatteryStatsHelper; private BatteryUsageStats mBatteryUsageStats; private final BatteryInfo mBatteryInfo; private List<AppInfo> mHighUsageAppList; @VisibleForTesting Loading @@ -55,9 +53,9 @@ public class HighUsageDetector implements BatteryTipDetector { boolean mDischarging; public HighUsageDetector(Context context, BatteryTipPolicy policy, BatteryStatsHelper batteryStatsHelper, BatteryInfo batteryInfo) { BatteryUsageStats batteryUsageStats, BatteryInfo batteryInfo) { mPolicy = policy; mBatteryStatsHelper = batteryStatsHelper; mBatteryUsageStats = batteryUsageStats; mBatteryInfo = batteryInfo; mHighUsageAppList = new ArrayList<>(); mBatteryUtils = BatteryUtils.getInstance(context); Loading @@ -69,37 +67,35 @@ public class HighUsageDetector implements BatteryTipDetector { @Override public BatteryTip detect() { final long lastFullChargeTimeMs = mBatteryUtils.calculateLastFullChargeTime( mBatteryStatsHelper, System.currentTimeMillis()); mBatteryUsageStats, System.currentTimeMillis()); if (mPolicy.highUsageEnabled && mDischarging) { parseBatteryData(); if (mDataParser.isDeviceHeavilyUsed() || mPolicy.testHighUsageTip) { final BatteryStats batteryStats = mBatteryStatsHelper.getStats(); final List<BatterySipper> batterySippers = new ArrayList<>(mBatteryStatsHelper.getUsageList()); final double totalPower = mBatteryStatsHelper.getTotalPower(); final int dischargeAmount = batteryStats != null ? batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED) : 0; Collections.sort(batterySippers, (sipper1, sipper2) -> Double.compare(sipper2.totalSmearedPowerMah, sipper1.totalSmearedPowerMah)); for (BatterySipper batterySipper : batterySippers) { final double totalPower = mBatteryUsageStats.getConsumedPower(); final int dischargeAmount = mBatteryUsageStats.getDischargePercentage(); final List<UidBatteryConsumer> uidBatteryConsumers = mBatteryUsageStats.getUidBatteryConsumers(); // Sort by descending power uidBatteryConsumers.sort( (consumer1, consumer2) -> Double.compare(consumer2.getConsumedPower(), consumer1.getConsumedPower())); for (UidBatteryConsumer consumer : uidBatteryConsumers) { final double percent = mBatteryUtils.calculateBatteryPercent( batterySipper.totalSmearedPowerMah, totalPower, dischargeAmount); if ((percent + 0.5f < 1f) || mBatteryUtils.shouldHideSipper(batterySipper)) { consumer.getConsumedPower(), totalPower, dischargeAmount); if ((percent + 0.5f < 1f) || mBatteryUtils.shouldHideUidBatteryConsumer(consumer)) { // Don't show it if we should hide or usage percentage is lower than 1% continue; } mHighUsageAppList.add(new AppInfo.Builder() .setUid(batterySipper.getUid()) .setUid(consumer.getUid()) .setPackageName( mBatteryUtils.getPackageName(batterySipper.getUid())) mBatteryUtils.getPackageName(consumer.getUid())) .build()); if (mHighUsageAppList.size() >= mPolicy.highUsageAppCount) { break; } } // When in test mode, add an app if necessary Loading
src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +6 −5 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.BatteryUsageStats; import android.util.ArrayMap; import android.view.View; Loading @@ -40,11 +41,10 @@ import androidx.slice.builders.ListBuilder; import androidx.slice.builders.ListBuilder.RowBuilder; import androidx.slice.builders.SliceAction; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.fuelgauge.BatteryStatsHelperLoader; import com.android.settings.fuelgauge.BatteryUsageStatsLoader; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.fuelgauge.batterytip.BatteryTipLoader; import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; Loading Loading @@ -206,9 +206,10 @@ public class BatteryFixSlice implements CustomSliceable { @WorkerThread @VisibleForTesting static List<BatteryTip> refreshBatteryTips(Context context) { final BatteryStatsHelperLoader statsLoader = new BatteryStatsHelperLoader(context); final BatteryStatsHelper statsHelper = statsLoader.loadInBackground(); final BatteryTipLoader loader = new BatteryTipLoader(context, statsHelper); final BatteryUsageStatsLoader statsLoader = new BatteryUsageStatsLoader(context, /* includeBatteryHistory */ false); final BatteryUsageStats batteryUsageStats = statsLoader.loadInBackground(); final BatteryTipLoader loader = new BatteryTipLoader(context, batteryUsageStats); final List<BatteryTip> batteryTips = loader.loadInBackground(); for (BatteryTip batteryTip : batteryTips) { if (batteryTip.getState() != BatteryTip.StateType.INVISIBLE) { Loading