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

Commit 8af9e2cd authored by Michael Wachenschwanz's avatar Michael Wachenschwanz Committed by Android (Google) Code Review
Browse files

Merge "Log unexpected EnergyConsumer results"

parents 30adb922 35f09f4c
Loading
Loading
Loading
Loading
+75 −1
Original line number Diff line number Diff line
@@ -83,6 +83,9 @@ public class PowerStatsService extends SystemService {
    @Nullable
    @GuardedBy("this")
    private Looper mLooper;
    @Nullable
    @GuardedBy("this")
    private EnergyConsumer[] mEnergyConsumers = null;

    @VisibleForTesting
    static class Injector {
@@ -260,6 +263,15 @@ public class PowerStatsService extends SystemService {
        }
    }

    private EnergyConsumer[] getEnergyConsumerInfo() {
        synchronized (this) {
            if (mEnergyConsumers == null) {
                mEnergyConsumers = getPowerStatsHal().getEnergyConsumerInfo();
            }
            return mEnergyConsumers;
        }
    }

    public PowerStatsService(Context context) {
        this(context, new Injector());
    }
@@ -327,7 +339,69 @@ public class PowerStatsService extends SystemService {

    private void getEnergyConsumedAsync(CompletableFuture<EnergyConsumerResult[]> future,
            int[] energyConsumerIds) {
        future.complete(getPowerStatsHal().getEnergyConsumed(energyConsumerIds));
        EnergyConsumerResult[] results = getPowerStatsHal().getEnergyConsumed(energyConsumerIds);

        // STOPSHIP(253292374): Remove once missing EnergyConsumer results issue is resolved.
        EnergyConsumer[] energyConsumers = getEnergyConsumerInfo();
        if (energyConsumers != null) {
            final int expectedLength;
            if (energyConsumerIds.length == 0) {
                // Empty request is a request for all available EnergyConsumers.
                expectedLength = energyConsumers.length;
            } else {
                expectedLength = energyConsumerIds.length;
            }

            if (results == null || expectedLength != results.length) {
                // Mismatch in requested/received energy consumer data.
                StringBuilder sb = new StringBuilder();
                sb.append("Requested ids:");
                if (energyConsumerIds.length == 0) {
                    sb.append("ALL");
                }
                sb.append("[");
                for (int i = 0; i < expectedLength; i++) {
                    final int id = energyConsumerIds[i];
                    sb.append(id);
                    sb.append("(type:");
                    sb.append(energyConsumers[id].type);
                    sb.append(",ord:");
                    sb.append(energyConsumers[id].ordinal);
                    sb.append(",name:");
                    sb.append(energyConsumers[id].name);
                    sb.append(")");
                    if (i != expectedLength - 1) {
                        sb.append(", ");
                    }
                }
                sb.append("]");

                sb.append(", Received result ids:");
                if (results == null) {
                    sb.append("null");
                } else {
                    sb.append("[");
                    final int resultLength = results.length;
                    for (int i = 0; i < resultLength; i++) {
                        final int id = results[i].id;
                        sb.append(id);
                        sb.append("(type:");
                        sb.append(energyConsumers[id].type);
                        sb.append(",ord:");
                        sb.append(energyConsumers[id].ordinal);
                        sb.append(",name:");
                        sb.append(energyConsumers[id].name);
                        sb.append(")");
                        if (i != resultLength - 1) {
                            sb.append(", ");
                        }
                    }
                    sb.append("]");
                }
                Slog.wtf(TAG, "Missing result from getEnergyConsumedAsync call. " + sb);
            }
        }
        future.complete(results);
    }

    private void getStateResidencyAsync(CompletableFuture<StateResidencyResult[]> future,