power.stats: Add AidlStateResidencyDataProvider

Some drivers that we want to collect power stats from are pass-through
and would require significant changes in order to provide a sysfs node
that the current power stats framework can pull stats from.

These pass-through drivers typically have a userspace daemon that is
capable of keeping track of the power stats and providing them to the
power.stats HAL service, but currently have no way to do that.

The AidlStateResidencyDataProvider will provide a vendor binder service
that will allow the userspace daemon to push updates or the power
statistics to power.stats HAL.

Bug: 117585786
Test: Created a PTS test to update some mock power entities that were
created using the AidlStateResidencyDataProvider. Further testing is
planned when real power entities start using this.

Change-Id: I4506ce7db84bbce2a8b271a870267040a7fa448f
diff --git a/powerstats/Android.bp b/powerstats/Android.bp
index fd3d305..491498d 100644
--- a/powerstats/Android.bp
+++ b/powerstats/Android.bp
@@ -33,6 +33,8 @@
         "liblog",
         "libutils",
         "android.hardware.power.stats@1.0",
+        "pixelpowerstats_provider_aidl_interface-cpp",
+        "libbinder",
     ],
     vendor: true,
 }
diff --git a/powerstats/service.cpp b/powerstats/service.cpp
index 022f41a..b2d3fd0 100644
--- a/powerstats/service.cpp
+++ b/powerstats/service.cpp
@@ -17,8 +17,12 @@
 #define LOG_TAG "android.hardware.power.stats@1.0-service.pixel"
 
 #include <android/log.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
+#include <binder/ProcessState.h>
 #include <hidl/HidlTransportSupport.h>
 
+#include <pixelpowerstats/AidlStateResidencyDataProvider.h>
 #include <pixelpowerstats/GenericStateResidencyDataProvider.h>
 #include <pixelpowerstats/PowerStats.h>
 #include <pixelpowerstats/WlanStateResidencyDataProvider.h>
@@ -40,6 +44,7 @@
 using android::hardware::power::stats::V1_0::implementation::PowerStats;
 
 // Pixel specific
+using android::hardware::google::pixel::powerstats::AidlStateResidencyDataProvider;
 using android::hardware::google::pixel::powerstats::GenericStateResidencyDataProvider;
 using android::hardware::google::pixel::powerstats::PowerEntityConfig;
 using android::hardware::google::pixel::powerstats::StateResidencyConfig;
@@ -65,8 +70,8 @@
          .totalTimeTransform = rpmConvertToMs,
          .lastEntrySupported = false}};
 
-    auto rpmSdp =
-        std::make_shared<GenericStateResidencyDataProvider>("/d/system_stats");
+    sp<GenericStateResidencyDataProvider> rpmSdp =
+            new GenericStateResidencyDataProvider("/d/system_stats");
 
     uint32_t apssId = service->addPowerEntity("APSS", PowerEntityType::SUBSYSTEM);
     rpmSdp->addEntity(apssId, PowerEntityConfig("APSS", rpmStateResidencyConfigs));
@@ -80,7 +85,7 @@
     uint32_t slpiId = service->addPowerEntity("SLPI", PowerEntityType::SUBSYSTEM);
     rpmSdp->addEntity(slpiId, PowerEntityConfig("SLPI", rpmStateResidencyConfigs));
 
-    service->addStateResidencyDataProvider(std::move(rpmSdp));
+    service->addStateResidencyDataProvider(rpmSdp);
 
     // Add SoC power entity
     std::vector<StateResidencyConfig> socStateResidencyConfigs = {
@@ -99,24 +104,43 @@
          .totalTimePrefix = "actual last sleep(msec):",
          .lastEntrySupported = false}};
 
-    auto socSdp =
-        std::make_shared<GenericStateResidencyDataProvider>("/d/system_stats");
+     sp<GenericStateResidencyDataProvider> socSdp =
+            new GenericStateResidencyDataProvider("/d/system_stats");
 
     uint32_t socId = service->addPowerEntity("SoC", PowerEntityType::POWER_DOMAIN);
     socSdp->addEntity(socId, PowerEntityConfig(socStateResidencyConfigs));
 
-    service->addStateResidencyDataProvider(std::move(socSdp));
+    service->addStateResidencyDataProvider(socSdp);
 
     // Add WLAN power entity
     uint32_t wlanId = service->addPowerEntity("WLAN", PowerEntityType::SUBSYSTEM);
-    auto wlanSdp =
-        std::make_shared<WlanStateResidencyDataProvider>(wlanId, "/d/wlan0/power_stats");
-    service->addStateResidencyDataProvider(std::move(wlanSdp));
+    sp<WlanStateResidencyDataProvider> wlanSdp =
+            new WlanStateResidencyDataProvider(wlanId, "/d/wlan0/power_stats");
+    service->addStateResidencyDataProvider(wlanSdp);
 
     // Add Easel power entity
     uint32_t easelId = service->addPowerEntity("Easel", PowerEntityType::SUBSYSTEM);
-    auto easelSdp = std::make_shared<EaselStateResidencyDataProvider>(easelId);
-    service->addStateResidencyDataProvider(std::move(easelSdp));
+    sp<EaselStateResidencyDataProvider> easelSdp = new EaselStateResidencyDataProvider(easelId);
+    service->addStateResidencyDataProvider(easelSdp);
+
+    // Add Power Entities that require the Aidl data provider
+    sp<AidlStateResidencyDataProvider> aidlSdp = new AidlStateResidencyDataProvider();
+    // TODO(117585786): Add real power entities here
+    // uint32_t mock1Id = service->addPowerEntity("Mock1", PowerEntityType::SUBSYSTEM);
+    // aidlSdp->addEntity(mock1Id, "Mock1", {"state_a", "state_b"});
+    // uint32_t mock2Id = service->addPowerEntity("Mock2", PowerEntityType::SUBSYSTEM);
+    // aidlSdp->addEntity(mock2Id, "Mock2", {"state_c", "state_d"});
+
+    auto serviceStatus = android::defaultServiceManager()->addService(
+            android::String16("power.stats-vendor"), aidlSdp);
+    if (serviceStatus != android::OK) {
+        ALOGE("Unable to register power.stats-vendor service %d", serviceStatus);
+        return 1;
+    }
+    sp<android::ProcessState> ps{android::ProcessState::self()};  // Create non-HW binder threadpool
+    ps->startThreadPool();
+
+    service->addStateResidencyDataProvider(aidlSdp);
 
     // Configure the threadpool
     configureRpcThreadpool(1, true /*callerWillJoin*/);