power: Add OnNewUdevDevice for Init/OnUdevEvent in sar_watcher

Add OnNewUdevDevice() to handle new udev device in Init() and
OnUdevEvent() in sar_watcher.

BUG=b:123434029
TEST=FEASURES="test" emerge-octopus power_manager

Change-Id: I9fca8a10dfb60cc0dd01c218d0a69623c8565c68
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2432144
Commit-Queue: Ching-Kang Yen <chingkang@chromium.org>
Tested-by: Ching-Kang Yen <chingkang@chromium.org>
Reviewed-by: Puthikorn Voravootivat <puthik@chromium.org>
Reviewed-by: Todd Broch <tbroch@chromium.org>
Reviewed-by: Heng-ruey Hsu <henryhsu@chromium.org>
Reviewed-by: Gwendal Grignou <gwendal@chromium.org>
diff --git a/power_manager/powerd/system/sar_watcher.cc b/power_manager/powerd/system/sar_watcher.cc
index c7488f9..f4c7f54 100644
--- a/power_manager/powerd/system/sar_watcher.cc
+++ b/power_manager/powerd/system/sar_watcher.cc
@@ -13,6 +13,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <memory>
 #include <utility>
 #include <vector>
 
@@ -87,15 +88,8 @@
     return false;
   }
 
-  for (auto const& iio_dev : iio_devices) {
-    std::string devlink;
-    if (!IsIioProximitySensor(iio_dev, &devlink))
-      continue;
-    if (!OnSensorDetected(iio_dev.syspath, devlink)) {
-      LOG(ERROR) << "Unable to set up proximity sensor " << iio_dev.syspath;
-    }
-  }
-
+  for (auto const& iio_dev : iio_devices)
+    OnNewUdevDevice(iio_dev);
   return true;
 }
 
@@ -118,14 +112,7 @@
 void SarWatcher::OnUdevEvent(const UdevEvent& event) {
   if (event.action != UdevEvent::Action::ADD)
     return;
-
-  std::string devlink;
-  if (!IsIioProximitySensor(event.device_info, &devlink))
-    return;
-
-  if (!OnSensorDetected(event.device_info.syspath, devlink))
-    LOG(ERROR) << "Unable to setup proximity sensor "
-               << event.device_info.syspath;
+  OnNewUdevDevice(event.device_info);
 }
 
 void SarWatcher::OnFileCanReadWithoutBlocking(int fd) {
@@ -363,5 +350,13 @@
   return true;
 }
 
+void SarWatcher::OnNewUdevDevice(const UdevDeviceInfo& device_info) {
+  std::string devlink;
+  if (!IsIioProximitySensor(device_info, &devlink))
+    return;
+  if (!OnSensorDetected(device_info.syspath, devlink))
+    LOG(ERROR) << "Unable to setup proximity sensor " << device_info.syspath;
+}
+
 }  // namespace system
 }  // namespace power_manager
diff --git a/power_manager/powerd/system/sar_watcher.h b/power_manager/powerd/system/sar_watcher.h
index e71802b..b9d231c 100644
--- a/power_manager/powerd/system/sar_watcher.h
+++ b/power_manager/powerd/system/sar_watcher.h
@@ -104,6 +104,10 @@
   // valid proximity sensor exists.
   bool OnSensorDetected(const std::string& syspath, const std::string& devlink);
 
+  // Check new udev device. If the device of |device_info| is a proximity
+  // sensor, start listening to proximity events for it.
+  void OnNewUdevDevice(const UdevDeviceInfo& device_info);
+
   OpenIioEventsFunc open_iio_events_func_;
 
   UdevInterface* udev_ = nullptr;  // non-owned