arc: Allow multiple bindings for a SensorDevice

ARC sensor HAL binds the same SensorDevice twice.
Once to query the sensor info, and once more to read sensor data.

Due to out-of-order mojo message arrival, the latter binding may
happen before the previous binding is closed.

BUG=b:162521349
TEST=Android app can access sensor data

Change-Id: I445e09623fa20ef55dd1a09a4fb1aa73074ed4ae
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2332199
Tested-by: Ryo Hashimoto <hashimoto@chromium.org>
Reviewed-by: Yusuke Sato <yusukes@chromium.org>
Commit-Queue: Ryo Hashimoto <hashimoto@chromium.org>
diff --git a/arc/vm/sensor_service/sensor_device_impl.cc b/arc/vm/sensor_service/sensor_device_impl.cc
index 5ff2221..06fc7f5 100644
--- a/arc/vm/sensor_service/sensor_device_impl.cc
+++ b/arc/vm/sensor_service/sensor_device_impl.cc
@@ -34,13 +34,14 @@
 
 SensorDeviceImpl::SensorDeviceImpl(const base::FilePath& iio_sysfs_dir,
                                    const base::FilePath& device_file)
-    : iio_sysfs_dir_(iio_sysfs_dir), device_file_(device_file) {}
+    : iio_sysfs_dir_(iio_sysfs_dir), device_file_(device_file) {
+  bindings_.set_connection_error_handler(base::BindRepeating(
+      []() { LOG(INFO) << "SensorDevice connection closed."; }));
+}
 SensorDeviceImpl::~SensorDeviceImpl() = default;
 
 void SensorDeviceImpl::Bind(mojom::SensorDeviceRequest request) {
-  binding_.Bind(std::move(request));
-  binding_.set_connection_error_handler(base::BindOnce(
-      []() { LOG(ERROR) << "SensorDevice connection closed."; }));
+  bindings_.AddBinding(this, std::move(request));
 }
 
 void SensorDeviceImpl::GetAttribute(const std::string& name,
diff --git a/arc/vm/sensor_service/sensor_device_impl.h b/arc/vm/sensor_service/sensor_device_impl.h
index 77dfa06..5e3e0f5 100644
--- a/arc/vm/sensor_service/sensor_device_impl.h
+++ b/arc/vm/sensor_service/sensor_device_impl.h
@@ -9,7 +9,7 @@
 #include <string>
 
 #include <base/files/file_descriptor_watcher_posix.h>
-#include <mojo/public/cpp/bindings/binding.h>
+#include <mojo/public/cpp/bindings/binding_set.h>
 
 #include "arc/vm/sensor_service/sensor_service.mojom.h"
 
@@ -41,7 +41,7 @@
 
   const base::FilePath iio_sysfs_dir_;
   const base::FilePath device_file_;
-  mojo::Binding<mojom::SensorDevice> binding_{this};
+  mojo::BindingSet<mojom::SensorDevice> bindings_;
 
   base::ScopedFD device_fd_, pipe_write_end_;
   std::unique_ptr<base::FileDescriptorWatcher::Controller> device_fd_watcher_;