Merge "Implement host wake/sleep notifications for AOC" into sc-d1-dev
diff --git a/platform/aoc/power_control_manager.cc b/platform/aoc/power_control_manager.cc
index 9caef07..fcf2bb5 100644
--- a/platform/aoc/power_control_manager.cc
+++ b/platform/aoc/power_control_manager.cc
@@ -16,12 +16,26 @@
 
 #include "chre/platform/power_control_manager.h"
 
+#include "chre/core/event_loop_manager.h"
+
 namespace chre {
 
 PowerControlManagerBase::PowerControlManagerBase() : mHostIsAwake(true) {}
 
-void PowerControlManagerBase::onHostWakeSuspendEvent(bool /* awake */) {
-  // TODO: stubbed out, Implement this.
+void PowerControlManagerBase::onHostWakeSuspendEvent(bool awake) {
+  if (mHostIsAwake != awake) {
+    mHostIsAwake = awake;
+
+    if (!awake) {
+      EventLoopManagerSingleton::get()
+          ->getHostCommsManager()
+          .resetBlameForNanoappHostWakeup();
+    }
+
+    EventLoopManagerSingleton::get()->getEventLoop().postEventOrDie(
+        awake ? CHRE_EVENT_HOST_AWAKE : CHRE_EVENT_HOST_ASLEEP,
+        nullptr /* eventData */, nullptr /* freeCallback */);
+  }
 }
 
 void PowerControlManager::postEventLoopProcess(size_t /* numPendingEvents */) {
diff --git a/platform/usf/platform_sensor_manager.cc b/platform/usf/platform_sensor_manager.cc
index 9e77462..1b35b39 100644
--- a/platform/usf/platform_sensor_manager.cc
+++ b/platform/usf/platform_sensor_manager.cc
@@ -70,6 +70,9 @@
 
 void PlatformSensorManager::init() {
   mHelper.init(this);
+  if (!mHelper.registerForApPowerStateUpdates()) {
+    LOGE("Failed to register for AP power state updates.");
+  }
 }
 
 DynamicVector<Sensor> PlatformSensorManager::getSensors() {
diff --git a/platform/usf/usf_helper.cc b/platform/usf/usf_helper.cc
index 292b094..4a1e58e 100644
--- a/platform/usf/usf_helper.cc
+++ b/platform/usf/usf_helper.cc
@@ -71,7 +71,7 @@
   const usf::UsfSensorSamplingEvent *updateEvent =
       static_cast<usf::UsfSensorSamplingEvent *>(event);
 
-  if (updateEvent != nullptr) {
+  if (context != nullptr && updateEvent != nullptr) {
     auto *mgr = static_cast<UsfHelper *>(context);
     mgr->processStatusUpdate(updateEvent);
   }
@@ -81,16 +81,20 @@
   const auto *updateEvent =
       static_cast<usf::UsfSensorTransformConfigEvent *>(event);
 
-  if (updateEvent != nullptr) {
+  if (context != nullptr && updateEvent != nullptr) {
     auto *mgr = static_cast<UsfHelper *>(context);
     mgr->processBiasUpdate(updateEvent);
   }
 }
 
-// Commented out because of unused compiler error
-// void apPowerStateUpdateHandler(void *context, usf::UsfEvent *event) {
-// TODO: Implement
-// }
+void apPowerStateUpdateHandler(void *context, usf::UsfEvent *event) {
+  const auto *updateEvent = static_cast<usf::UsfApPowerStateEvent *>(event);
+
+  if (context != nullptr && updateEvent != nullptr) {
+    auto *mgr = static_cast<UsfHelper *>(context);
+    mgr->processApPowerStateUpdate(updateEvent);
+  }
+}
 
 void asyncCallback(usf::UsfReq *req, const usf::UsfResp *resp, void *data) {
   auto callbackData = static_cast<AsyncCallbackData *>(data);
@@ -402,8 +406,19 @@
 }
 
 bool UsfHelper::registerForApPowerStateUpdates() {
-  // TODO: Implement
-  return true;
+  bool success = false;
+  if (!mUsfEventListeners.emplace_back()) {
+    LOG_OOM();
+  } else {
+    UsfErr err = usf::UsfPowerMgr::GetApPowerEventType()->AddListener(
+        mWorker.get(), apPowerStateUpdateHandler, this,
+        &mUsfEventListeners.back());
+    success = (err == kErrNone);
+    if (!success) {
+      LOG_USF_ERR(err);
+    }
+  }
+  return success;
 }
 
 void UsfHelper::unregisterForBiasUpdates(
@@ -565,7 +580,12 @@
 
 void UsfHelper::processApPowerStateUpdate(
     const usf::UsfApPowerStateEvent *update) {
-  // TODO: Implement
+  usf::UsfApPowerState state = update->GetState();
+  if (state == usf::kUsfApPowerStateInvalid) {
+    LOGE("Invalid AP power state received.");
+  } else {
+    mCallback->onHostWakeSuspendEvent(state == usf::kUsfApPowerStateOn);
+  }
 }
 
 bool UsfHelper::createSensorEvent(