Merge "Log unexpected EnergyConsumer results"
diff --git a/services/core/java/com/android/server/powerstats/PowerStatsService.java b/services/core/java/com/android/server/powerstats/PowerStatsService.java
index 9953ca8..1358417 100644
--- a/services/core/java/com/android/server/powerstats/PowerStatsService.java
+++ b/services/core/java/com/android/server/powerstats/PowerStatsService.java
@@ -83,6 +83,9 @@
     @Nullable
     @GuardedBy("this")
     private Looper mLooper;
+    @Nullable
+    @GuardedBy("this")
+    private EnergyConsumer[] mEnergyConsumers = null;
 
     @VisibleForTesting
     static class Injector {
@@ -260,6 +263,15 @@
         }
     }
 
+    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 @@
 
     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,