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

Commit 259d5d2c authored by Milo Sredkov's avatar Milo Sredkov
Browse files

Collect camera power consumption into BatteryStats

Plumb through the camera energy consumption from Power Stats HAL to
BatteryStatsImpl. Allowing clients to query global and per-uid stats
will be done in follow-up changes.

Bug: 258319905
Change-Id: I9d5243164e388a90f6d1ceb9345e893cf1aa5f1d
Test: atest BatteryStatsTests
parent f5340028
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -58,7 +58,8 @@ public class EnergyConsumerStats {
    public static final int POWER_BUCKET_BLUETOOTH = 5;
    public static final int POWER_BUCKET_GNSS = 6;
    public static final int POWER_BUCKET_MOBILE_RADIO = 7;
    public static final int NUMBER_STANDARD_POWER_BUCKETS = 8; // Buckets above this are custom.
    public static final int POWER_BUCKET_CAMERA = 8;
    public static final int NUMBER_STANDARD_POWER_BUCKETS = 9; // Buckets above this are custom.

    @IntDef(prefix = {"POWER_BUCKET_"}, value = {
            POWER_BUCKET_UNKNOWN,
@@ -70,6 +71,7 @@ public class EnergyConsumerStats {
            POWER_BUCKET_BLUETOOTH,
            POWER_BUCKET_GNSS,
            POWER_BUCKET_MOBILE_RADIO,
            POWER_BUCKET_CAMERA,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface StandardPowerBucket {
+1 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ java_library_static {
        "android.hardware.ir-V1-java",
        "android.hardware.rebootescrow-V1-java",
        "android.hardware.soundtrigger-V2.3-java",
        "android.hardware.power.stats-V1-java",
        "android.hardware.power.stats-V2-java",
        "android.hardware.power-V4-java",
        "android.hidl.manager-V1.2-java",
        "icu4j_calendar_astronomer",
+11 −0
Original line number Diff line number Diff line
@@ -710,6 +710,11 @@ public class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStat
                if (gnssChargeUC != EnergyConsumerSnapshot.UNAVAILABLE) {
                    mStats.updateGnssEnergyConsumerStatsLocked(gnssChargeUC, elapsedRealtime);
                }

                final long cameraChargeUC = energyConsumerDeltas.cameraChargeUC;
                if (cameraChargeUC != EnergyConsumerSnapshot.UNAVAILABLE) {
                    mStats.updateCameraEnergyConsumerStatsLocked(cameraChargeUC, elapsedRealtime);
                }
            }
            // Inform mStats about each applicable custom energy bucket.
            if (energyConsumerDeltas != null
@@ -904,6 +909,9 @@ public class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStat
                case EnergyConsumerType.WIFI:
                    buckets[EnergyConsumerStats.POWER_BUCKET_WIFI] = true;
                    break;
                case EnergyConsumerType.CAMERA:
                    buckets[EnergyConsumerStats.POWER_BUCKET_CAMERA] = true;
                    break;
            }
        }
        return buckets;
@@ -955,6 +963,9 @@ public class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStat
        if ((flags & UPDATE_WIFI) != 0) {
            addEnergyConsumerIdLocked(energyConsumerIds, EnergyConsumerType.WIFI);
        }
        if ((flags & UPDATE_CAMERA) != 0) {
            addEnergyConsumerIdLocked(energyConsumerIds, EnergyConsumerType.CAMERA);
        }

        if (energyConsumerIds.size() == 0) {
            return null;
+38 −3
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ public class BatteryStatsImpl extends BatteryStats {
    // TODO: remove "tcp" from network methods, since we measure total stats.
    // Current on-disk Parcel version. Must be updated when the format of the parcelable changes
    public static final int VERSION = 210;
    public static final int VERSION = 211;
    // The maximum number of names wakelocks we will keep track of
    // per uid; once the limit is reached, we batch the remaining wakelocks
@@ -649,10 +649,12 @@ public class BatteryStatsImpl extends BatteryStats {
        int UPDATE_BT = 0x08;
        int UPDATE_RPM = 0x10;
        int UPDATE_DISPLAY = 0x20;
        int RESET = 0x40;
        int UPDATE_CAMERA = 0x40;
        int RESET = 0x80;
        int UPDATE_ALL =
                UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT | UPDATE_RPM | UPDATE_DISPLAY;
                UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT | UPDATE_RPM | UPDATE_DISPLAY
                        | UPDATE_CAMERA;
        int UPDATE_ON_PROC_STATE_CHANGE = UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT;
@@ -665,6 +667,7 @@ public class BatteryStatsImpl extends BatteryStats {
                UPDATE_BT,
                UPDATE_RPM,
                UPDATE_DISPLAY,
                UPDATE_CAMERA,
                UPDATE_ALL,
        })
        @Retention(RetentionPolicy.SOURCE)
@@ -6244,6 +6247,8 @@ public class BatteryStatsImpl extends BatteryStats {
        }
        getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                .noteCameraTurnedOnLocked(elapsedRealtimeMs);
        scheduleSyncExternalStatsLocked("camera-on", ExternalStatsSync.UPDATE_CAMERA);
    }
    @GuardedBy("this")
@@ -6259,6 +6264,8 @@ public class BatteryStatsImpl extends BatteryStats {
        }
        getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                .noteCameraTurnedOffLocked(elapsedRealtimeMs);
        scheduleSyncExternalStatsLocked("camera-off", ExternalStatsSync.UPDATE_CAMERA);
    }
    @GuardedBy("this")
@@ -6273,6 +6280,8 @@ public class BatteryStatsImpl extends BatteryStats {
                uid.noteResetCameraLocked(elapsedRealtimeMs);
            }
        }
        scheduleSyncExternalStatsLocked("camera-reset", ExternalStatsSync.UPDATE_CAMERA);
    }
    @GuardedBy("this")
@@ -12901,6 +12910,32 @@ public class BatteryStatsImpl extends BatteryStats {
                gnssTimeUsArray, 0, elapsedRealtimeMs);
    }
    /**
     * Accumulate camera charge consumption and distribute it to the correct state and the apps.
     *
     * @param chargeUC amount of charge (microcoulombs) used by the camera since this was last
     *         called.
     */
    @GuardedBy("this")
    public void updateCameraEnergyConsumerStatsLocked(long chargeUC, long elapsedRealtimeMs) {
        if (DEBUG_ENERGY) Slog.d(TAG, "Updating camera stats: " + chargeUC);
        if (mGlobalEnergyConsumerStats == null) {
            return;
        }
        if (!mOnBatteryInternal || chargeUC <= 0) {
            // There's nothing further to update.
            return;
        }
        // TODO(b/258319905): Handle mIgnoreNextExternalStats
        mGlobalEnergyConsumerStats.updateStandardBucket(
                EnergyConsumerStats.POWER_BUCKET_CAMERA, chargeUC);
        // TODO(b/258319905): Update per-UID stats.
    }
    /**
     * Accumulate Custom power bucket charge, globally and for each app.
     *
+10 −0
Original line number Diff line number Diff line
@@ -123,6 +123,9 @@ public class EnergyConsumerSnapshot {
        /** The chargeUC for {@link EnergyConsumerType#WIFI}. */
        public long wifiChargeUC = UNAVAILABLE;

        /** The chargeUC for {@link EnergyConsumerType#CAMERA}. */
        public long cameraChargeUC = UNAVAILABLE;

        /** Map of {@link EnergyConsumerType#OTHER} ordinals to their total chargeUC. */
        public @Nullable long[] otherTotalChargeUC = null;

@@ -256,6 +259,10 @@ public class EnergyConsumerSnapshot {
                    output.wifiChargeUC = deltaChargeUC;
                    break;

                case EnergyConsumerType.CAMERA:
                    output.cameraChargeUC = deltaChargeUC;
                    break;

                case EnergyConsumerType.OTHER:
                    if (output.otherTotalChargeUC == null) {
                        output.otherTotalChargeUC = new long[mNumOtherOrdinals];
@@ -458,6 +465,9 @@ public class EnergyConsumerSnapshot {
                case EnergyConsumerType.WIFI:
                    chargeUC[i] = delta.wifiChargeUC;
                    break;
                case EnergyConsumerType.CAMERA:
                    chargeUC[i] = delta.cameraChargeUC;
                    break;
                case EnergyConsumerType.OTHER:
                    if (delta.otherTotalChargeUC != null) {
                        chargeUC[i] = delta.otherTotalChargeUC[energyConsumer.ordinal];
Loading