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

Commit 53a761f5 authored by Kuan Wang's avatar Kuan Wang
Browse files

Populate new fields foreground_service_usage_time_in_ms,

foreground_usage_consume_power, foreground_service_usage_consume_power,
background_usage_consume_power and cached_usage_consume_power into
database and pass them to UI.

Test: make RunSettingsRoboTests + manual
Bug: 256123455
Bug: 258124768
Change-Id: Ic46032f67eff5898f9d4182c517bbebe478eca01
parent a6a7e029
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -629,6 +629,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
            PowerGaugePreference preference, BatteryDiffEntry entry) {
        final long foregroundUsageTimeInMs = entry.mForegroundUsageTimeInMs;
        final long backgroundUsageTimeInMs = entry.mBackgroundUsageTimeInMs;
        // TODO: update this value after the new API for foreground service is completed.
        final long totalUsageTimeInMs = foregroundUsageTimeInMs + backgroundUsageTimeInMs;
        String usageTimeSummary = null;
        // Not shows summary for some system components without usage time.
+32 −3
Original line number Diff line number Diff line
@@ -52,8 +52,13 @@ public class BatteryDiffEntry {
            (a, b) -> Double.compare(b.getPercentOfTotal(), a.getPercentOfTotal());

    public long mForegroundUsageTimeInMs;
    public long mForegroundServiceUsageTimeInMs;
    public long mBackgroundUsageTimeInMs;
    public double mConsumePower;
    public double mForegroundUsageConsumePower;
    public double mForegroundServiceUsageConsumePower;
    public double mBackgroundUsageConsumePower;
    public double mCachedUsageConsumePower;
    // A BatteryHistEntry corresponding to this diff usage data.
    public final BatteryHistEntry mBatteryHistEntry;

@@ -78,12 +83,22 @@ public class BatteryDiffEntry {
    public BatteryDiffEntry(
            Context context,
            long foregroundUsageTimeInMs,
            long foregroundServiceUsageTimeInMs,
            long backgroundUsageTimeInMs,
            double consumePower,
            double foregroundUsageConsumePower,
            double foregroundServiceUsageConsumePower,
            double backgroundUsageConsumePower,
            double cachedUsageConsumePower,
            BatteryHistEntry batteryHistEntry) {
        mContext = context;
        mConsumePower = consumePower;
        mForegroundUsageConsumePower = foregroundUsageConsumePower;
        mForegroundServiceUsageConsumePower = foregroundServiceUsageConsumePower;
        mBackgroundUsageConsumePower = backgroundUsageConsumePower;
        mCachedUsageConsumePower = cachedUsageConsumePower;
        mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
        mForegroundServiceUsageTimeInMs = foregroundServiceUsageTimeInMs;
        mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
        mBatteryHistEntry = batteryHistEntry;
        mUserManager = context.getSystemService(UserManager.class);
@@ -106,8 +121,13 @@ public class BatteryDiffEntry {
        return new BatteryDiffEntry(
                this.mContext,
                this.mForegroundUsageTimeInMs,
                this.mForegroundServiceUsageTimeInMs,
                this.mBackgroundUsageTimeInMs,
                this.mConsumePower,
                this.mForegroundUsageConsumePower,
                this.mForegroundServiceUsageConsumePower,
                this.mBackgroundUsageConsumePower,
                this.mCachedUsageConsumePower,
                this.mBatteryHistEntry /*same instance*/);
    }

@@ -361,10 +381,19 @@ public class BatteryDiffEntry {
                        mAppLabel, mValidForRestriction))
                .append(String.format("\n\tconsume=%.2f%% %f/%f",
                        mPercentOfTotal, mConsumePower, mTotalConsumePower))
                .append(String.format("\n\tforeground:%s background:%s",
                        StringUtil.formatElapsedTime(mContext, mForegroundUsageTimeInMs,
                .append(String.format("\n\tconsume power= foreground:%f foregroundService:%f",
                        mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
                .append(String.format("\n\tconsume power= background:%f cached:%f",
                        mBackgroundUsageConsumePower, mCachedUsageConsumePower))
                .append(String.format("\n\ttime= foreground:%s foregroundService:%s background:%s",
                        StringUtil.formatElapsedTime(mContext, (double) mForegroundUsageTimeInMs,
                                /*withSeconds=*/ true, /*collapseTimeUnit=*/ false),
                        StringUtil.formatElapsedTime(mContext, mBackgroundUsageTimeInMs,
                        StringUtil.formatElapsedTime(
                                mContext,
                                (double) mForegroundServiceUsageTimeInMs,
                                /*withSeconds=*/ true,
                                /*collapseTimeUnit=*/ false),
                        StringUtil.formatElapsedTime(mContext, (double) mBackgroundUsageTimeInMs,
                                /*withSeconds=*/ true, /*collapseTimeUnit=*/ false)))
                .append(String.format("\n\tpackage:%s|%s uid:%d userId:%d",
                        mBatteryHistEntry.mPackageName, getPackageName(),
+112 −4
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
import android.graphics.drawable.Drawable;
import android.os.BatteryConsumer;
import android.os.BatteryConsumer.Dimensions;
import android.os.Process;
import android.os.RemoteException;
import android.os.UidBatteryConsumer;
@@ -39,7 +40,6 @@ import com.android.settings.R;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settingslib.Utils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Locale;
@@ -73,9 +73,24 @@ public class BatteryEntry {
    private static final String TAG = "BatteryEntry";
    private static final String PACKAGE_SYSTEM = "android";

    static final HashMap<String, UidToDetail> sUidCache = new HashMap<>();
    static final int BATTERY_USAGE_INDEX_FOREGROUND = 0;
    static final int BATTERY_USAGE_INDEX_FOREGROUND_SERVICE = 1;
    static final int BATTERY_USAGE_INDEX_BACKGROUND = 2;
    static final int BATTERY_USAGE_INDEX_CACHED = 3;

    static final Dimensions[] BATTERY_DIMENSIONS = new Dimensions[] {
            new Dimensions(
                    BatteryConsumer.POWER_COMPONENT_ANY, BatteryConsumer.PROCESS_STATE_FOREGROUND),
            new Dimensions(
                    BatteryConsumer.POWER_COMPONENT_ANY,
                    BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE),
            new Dimensions(
                    BatteryConsumer.POWER_COMPONENT_ANY, BatteryConsumer.PROCESS_STATE_BACKGROUND),
            new Dimensions(
                    BatteryConsumer.POWER_COMPONENT_ANY, BatteryConsumer.PROCESS_STATE_CACHED),
    };

    static final ArrayList<BatteryEntry> sRequestQueue = new ArrayList<BatteryEntry>();
    static final HashMap<String, UidToDetail> sUidCache = new HashMap<>();

    static Locale sCurrentLocale = null;

@@ -97,6 +112,7 @@ public class BatteryEntry {
    private final int mPowerComponentId;
    private long mUsageDurationMs;
    private long mTimeInForegroundMs;
    private long mTimeInForegroundServiceMs;
    private long mTimeInBackgroundMs;

    public String mName;
@@ -105,6 +121,10 @@ public class BatteryEntry {
    public double mPercent;
    private String mDefaultPackageName;
    private double mConsumedPower;
    private double mConsumedPowerInForeground;
    private double mConsumedPowerInForegroundService;
    private double mConsumedPowerInBackground;
    private double mConsumedPowerInCached;

    static class UidToDetail {
        String mName;
@@ -156,8 +176,19 @@ public class BatteryEntry {
            getQuickNameIconForUid(uid, packages, loadDataInBackground);
            mTimeInForegroundMs =
                    uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
            //TODO: update this to the correct API after the new API is completed.
            mTimeInForegroundServiceMs =
                    uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND);
            mTimeInBackgroundMs =
                    uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND);
            mConsumedPowerInForeground = safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
            mConsumedPowerInForegroundService = safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
            mConsumedPowerInBackground = safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_BACKGROUND]);
            mConsumedPowerInCached = safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_CACHED]);
        } else if (batteryConsumer instanceof UserBatteryConsumer) {
            mUid = Process.INVALID_UID;
            mConsumerType = ConvertUtils.CONSUMER_TYPE_USER_BATTERY;
@@ -396,7 +427,7 @@ public class BatteryEntry {
        return mUid;
    }

    /** Returns foreground foreground time/ms that is attributed to this entry. */
    /** Returns foreground time/ms that is attributed to this entry. */
    public long getTimeInForegroundMs() {
        if (mBatteryConsumer instanceof UidBatteryConsumer) {
            return mTimeInForegroundMs;
@@ -405,6 +436,15 @@ public class BatteryEntry {
        }
    }

    /** Returns foreground service time/ms that is attributed to this entry. */
    public long getTimeInForegroundServiceMs() {
        if (mBatteryConsumer instanceof UidBatteryConsumer) {
            return mTimeInForegroundServiceMs;
        } else {
            return 0;
        }
    }

    /** Returns background activity time/ms that is attributed to this entry. */
    public long getTimeInBackgroundMs() {
        if (mBatteryConsumer instanceof UidBatteryConsumer) {
@@ -421,6 +461,53 @@ public class BatteryEntry {
        return mConsumedPower;
    }

    /**
     * Returns amount of power (in milli-amp-hours) used in foreground that is attributed to this
     * entry.
     */
    public double getConsumedPowerInForeground() {
        if (mBatteryConsumer instanceof UidBatteryConsumer) {
            return mConsumedPowerInForeground;
        } else {
            return 0;
        }
    }

    /**
     * Returns amount of power (in milli-amp-hours) used in foreground service that is attributed to
     * this entry.
     */
    public double getConsumedPowerInForegroundService() {
        if (mBatteryConsumer instanceof UidBatteryConsumer) {
            return mConsumedPowerInForegroundService;
        } else {
            return 0;
        }
    }

    /**
     * Returns amount of power (in milli-amp-hours) used in background that is attributed to this
     * entry.
     */
    public double getConsumedPowerInBackground() {
        if (mBatteryConsumer instanceof UidBatteryConsumer) {
            return mConsumedPowerInBackground;
        } else {
            return 0;
        }
    }

    /**
     * Returns amount of power (in milli-amp-hours) used in cached that is attributed to this entry.
     */
    public double getConsumedPowerInCached() {
        if (mBatteryConsumer instanceof UidBatteryConsumer) {
            return mConsumedPowerInCached;
        } else {
            return 0;
        }
    }

    /**
     * Adds the consumed power of the supplied BatteryConsumer to this entry. Also
     * uses its package with highest drain, if necessary.
@@ -431,8 +518,19 @@ public class BatteryEntry {
            UidBatteryConsumer uidBatteryConsumer = (UidBatteryConsumer) batteryConsumer;
            mTimeInForegroundMs += uidBatteryConsumer.getTimeInStateMs(
                    UidBatteryConsumer.STATE_FOREGROUND);
            //TODO: update this to the correct API after the new API is completed.
            mTimeInForegroundServiceMs += uidBatteryConsumer.getTimeInStateMs(
                    UidBatteryConsumer.STATE_FOREGROUND);
            mTimeInBackgroundMs += uidBatteryConsumer.getTimeInStateMs(
                    UidBatteryConsumer.STATE_BACKGROUND);
            mConsumedPowerInForeground += safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND]);
            mConsumedPowerInForegroundService += safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]);
            mConsumedPowerInBackground += safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_BACKGROUND]);
            mConsumedPowerInCached += safeGetConsumedPower(
                    uidBatteryConsumer, BATTERY_DIMENSIONS[BATTERY_USAGE_INDEX_CACHED]);
            if (mDefaultPackageName == null) {
                mDefaultPackageName = uidBatteryConsumer.getPackageWithHighestDrain();
            }
@@ -533,4 +631,14 @@ public class BatteryEntry {
    public static boolean isSystemUid(int uid) {
        return uid == Process.SYSTEM_UID;
    }

    private static double safeGetConsumedPower(
            final UidBatteryConsumer uidBatteryConsumer, final Dimensions dimension) {
        try {
            return uidBatteryConsumer.getConsumedPower(dimension);
        } catch (IllegalArgumentException e) {
            Log.e(TAG, "safeGetConsumedPower failed:" + e);
            return 0.0d;
        }
    }
}
+72 −6
Original line number Diff line number Diff line
@@ -50,8 +50,13 @@ public class BatteryHistEntry {
    // Records the battery usage relative information.
    public final double mTotalPower;
    public final double mConsumePower;
    public final double mForegroundUsageConsumePower;
    public final double mForegroundServiceUsageConsumePower;
    public final double mBackgroundUsageConsumePower;
    public final double mCachedUsageConsumePower;
    public final double mPercentOfTotal;
    public final long mForegroundUsageTimeInMs;
    public final long mForegroundServiceUsageTimeInMs;
    public final long mBackgroundUsageTimeInMs;
    @BatteryConsumer.PowerComponent
    public final int mDrainType;
@@ -79,8 +84,14 @@ public class BatteryHistEntry {
        mZoneId = batteryInformation.getZoneId();
        mTotalPower = batteryInformation.getTotalPower();
        mConsumePower = batteryInformation.getConsumePower();
        mForegroundUsageConsumePower = batteryInformation.getForegroundUsageConsumePower();
        mForegroundServiceUsageConsumePower =
                batteryInformation.getForegroundServiceUsageConsumePower();
        mBackgroundUsageConsumePower = batteryInformation.getBackgroundUsageConsumePower();
        mCachedUsageConsumePower = batteryInformation.getCachedUsageConsumePower();
        mPercentOfTotal = batteryInformation.getPercentOfTotal();
        mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
        mForegroundServiceUsageTimeInMs = batteryInformation.getForegroundServiceUsageTimeInMs();
        mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
        mDrainType = batteryInformation.getDrainType();
        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
@@ -103,8 +114,14 @@ public class BatteryHistEntry {
        mZoneId = batteryInformation.getZoneId();
        mTotalPower = batteryInformation.getTotalPower();
        mConsumePower = batteryInformation.getConsumePower();
        mForegroundUsageConsumePower = batteryInformation.getForegroundUsageConsumePower();
        mForegroundServiceUsageConsumePower =
                batteryInformation.getForegroundServiceUsageConsumePower();
        mBackgroundUsageConsumePower = batteryInformation.getBackgroundUsageConsumePower();
        mCachedUsageConsumePower = batteryInformation.getCachedUsageConsumePower();
        mPercentOfTotal = batteryInformation.getPercentOfTotal();
        mForegroundUsageTimeInMs = batteryInformation.getForegroundUsageTimeInMs();
        mForegroundServiceUsageTimeInMs = batteryInformation.getForegroundServiceUsageTimeInMs();
        mBackgroundUsageTimeInMs = batteryInformation.getBackgroundUsageTimeInMs();
        mDrainType = batteryInformation.getDrainType();
        final DeviceBatteryState deviceBatteryState = batteryInformation.getDeviceBatteryState();
@@ -119,7 +136,12 @@ public class BatteryHistEntry {
            long timestamp,
            double totalPower,
            double consumePower,
            double foregroundUsageConsumePower,
            double foregroundServiceUsageConsumePower,
            double backgroundUsageConsumePower,
            double cachedUsageConsumePower,
            long foregroundUsageTimeInMs,
            long foregroundServiceUsageTimeInMs,
            long backgroundUsageTimeInMs,
            int batteryLevel) {
        mUid = fromEntry.mUid;
@@ -132,8 +154,13 @@ public class BatteryHistEntry {
        mZoneId = fromEntry.mZoneId;
        mTotalPower = totalPower;
        mConsumePower = consumePower;
        mForegroundUsageConsumePower = foregroundUsageConsumePower;
        mForegroundServiceUsageConsumePower = foregroundServiceUsageConsumePower;
        mBackgroundUsageConsumePower = backgroundUsageConsumePower;
        mCachedUsageConsumePower = cachedUsageConsumePower;
        mPercentOfTotal = fromEntry.mPercentOfTotal;
        mForegroundUsageTimeInMs = foregroundUsageTimeInMs;
        mForegroundServiceUsageTimeInMs = foregroundServiceUsageTimeInMs;
        mBackgroundUsageTimeInMs = backgroundUsageTimeInMs;
        mDrainType = fromEntry.mDrainType;
        mConsumerType = fromEntry.mConsumerType;
@@ -190,9 +217,15 @@ public class BatteryHistEntry {
                        mPackageName, mAppLabel, mUid, mUserId, mIsHidden))
                .append(String.format("\n\ttimestamp=%s|zoneId=%s|bootTimestamp=%d",
                        recordAtDateTime, mZoneId, Duration.ofMillis(mBootTimestamp).getSeconds()))
                .append(String.format("\n\tusage=%f|total=%f|consume=%f|elapsedTime=%d|%d",
                        mPercentOfTotal, mTotalPower, mConsumePower,
                .append(String.format("\n\tusage=%f|total=%f|consume=%f",
                        mPercentOfTotal, mTotalPower, mConsumePower))
                .append(String.format("\n\tforeground=%f|foregroundService=%f",
                        mForegroundUsageConsumePower, mForegroundServiceUsageConsumePower))
                .append(String.format("\n\tbackground=%f|cached=%f",
                        mBackgroundUsageConsumePower, mCachedUsageConsumePower))
                .append(String.format("\n\telapsedTime=%d|%d|%d",
                        Duration.ofMillis(mForegroundUsageTimeInMs).getSeconds(),
                        Duration.ofMillis(mForegroundServiceUsageTimeInMs).getSeconds(),
                        Duration.ofMillis(mBackgroundUsageTimeInMs).getSeconds()))
                .append(String.format("\n\tdrainType=%d|consumerType=%d",
                        mDrainType, mConsumerType))
@@ -267,17 +300,45 @@ public class BatteryHistEntry {
                lowerHistEntry == null ? 0 : lowerHistEntry.mConsumePower,
                upperHistEntry.mConsumePower,
                ratio);
        final double foregroundUsageConsumePower = interpolate(
                lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageConsumePower,
                upperHistEntry.mForegroundUsageConsumePower,
                ratio);
        final double foregroundServiceUsageConsumePower = interpolate(
                lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundServiceUsageConsumePower,
                upperHistEntry.mForegroundServiceUsageConsumePower,
                ratio);
        final double backgroundUsageConsumePower = interpolate(
                lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageConsumePower,
                upperHistEntry.mBackgroundUsageConsumePower,
                ratio);
        final double cachedUsageConsumePower = interpolate(
                lowerHistEntry == null ? 0 : lowerHistEntry.mCachedUsageConsumePower,
                upperHistEntry.mCachedUsageConsumePower,
                ratio);
        final double foregroundUsageTimeInMs = interpolate(
                lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageTimeInMs,
                upperHistEntry.mForegroundUsageTimeInMs,
                (double) (lowerHistEntry == null ? 0 : lowerHistEntry.mForegroundUsageTimeInMs),
                (double) upperHistEntry.mForegroundUsageTimeInMs,
                ratio);
        final double foregroundServiceUsageTimeInMs = interpolate(
                (double) (lowerHistEntry == null
                        ? 0
                        : lowerHistEntry.mForegroundServiceUsageTimeInMs),
                (double) upperHistEntry.mForegroundServiceUsageTimeInMs,
                ratio);
        final double backgroundUsageTimeInMs = interpolate(
                lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageTimeInMs,
                upperHistEntry.mBackgroundUsageTimeInMs,
                (double) (lowerHistEntry == null ? 0 : lowerHistEntry.mBackgroundUsageTimeInMs),
                (double) upperHistEntry.mBackgroundUsageTimeInMs,
                ratio);
        // Checks whether there is any abnormal cases!
        if (upperHistEntry.mConsumePower < consumePower
                || upperHistEntry.mForegroundUsageConsumePower < foregroundUsageConsumePower
                || upperHistEntry.mForegroundServiceUsageConsumePower
                < foregroundServiceUsageConsumePower
                || upperHistEntry.mBackgroundUsageConsumePower < backgroundUsageConsumePower
                || upperHistEntry.mCachedUsageConsumePower < cachedUsageConsumePower
                || upperHistEntry.mForegroundUsageTimeInMs < foregroundUsageTimeInMs
                || upperHistEntry.mForegroundServiceUsageTimeInMs < foregroundServiceUsageTimeInMs
                || upperHistEntry.mBackgroundUsageTimeInMs < backgroundUsageTimeInMs) {
            if (DEBUG) {
                Log.w(TAG, String.format(
@@ -299,7 +360,12 @@ public class BatteryHistEntry {
                /*timestamp=*/ slotTimestamp,
                totalPower,
                consumePower,
                foregroundUsageConsumePower,
                foregroundServiceUsageConsumePower,
                backgroundUsageConsumePower,
                cachedUsageConsumePower,
                Math.round(foregroundUsageTimeInMs),
                Math.round(foregroundServiceUsageTimeInMs),
                Math.round(backgroundUsageTimeInMs),
                (int) Math.round(batteryLevel));
    }
Loading