dynamic_sensor: Add sensor manager init to sub-HAL 2.1.

Bug: 195964858
Test: Verified dynamic sensor manager is present in sensor list and that
 no SELinux violations occur on sc-v2-dev and master.

$ make -j28 && \
         vendor/google/tools/flashall -w -s 14281FDEE000A5 --disable_verity && \
         sleep 90 && adb root
.
.
.
$ adb shell sensor_test list | grep "sensor_test\|Type\|Dynamic"
sensor_test version 74
Type     Subtype  Name
32       0        Dynamic Sensor Manager
$ adb logcat -d | grep avc | grep sensor
$

Change-Id: Ib3da287e4f4118ad6b19498248e263f8c1662b3a
diff --git a/modules/sensors/dynamic_sensor/ConnectionDetector.cpp b/modules/sensors/dynamic_sensor/ConnectionDetector.cpp
index c51e912..c009a70 100644
--- a/modules/sensors/dynamic_sensor/ConnectionDetector.cpp
+++ b/modules/sensors/dynamic_sensor/ConnectionDetector.cpp
@@ -57,8 +57,6 @@
     std::ostringstream s;
     s << "socket:" << port;
     mDevice = s.str();
-
-    run("ddad_socket");
 }
 
 SocketConnectionDetector::~SocketConnectionDetector() {
@@ -67,6 +65,12 @@
     }
 }
 
+void SocketConnectionDetector::Init() {
+    // run adds a strong reference to this object, so it can't be invoked from
+    // the constructor.
+    run("ddad_socket");
+}
+
 int SocketConnectionDetector::waitForConnection() {
     return ::accept(mListenFd, nullptr, nullptr);
 }
@@ -124,9 +128,6 @@
         ALOGE("Cannot setup watch on dir %s", path.c_str());
         return;
     }
-
-    // mLooper != null && mInotifyFd added to looper
-    run("ddad_file");
 }
 
 FileConnectionDetector::~FileConnectionDetector() {
@@ -138,6 +139,13 @@
     }
 }
 
+void FileConnectionDetector::Init() {
+    // mLooper != null && mInotifyFd added to looper
+    // run adds a strong reference to this object, so it can't be invoked from
+    // the constructor.
+    run("ddad_file");
+}
+
 bool FileConnectionDetector::matches(const std::string &name) const {
     return std::regex_match(name, mRegex);
 }
diff --git a/modules/sensors/dynamic_sensor/ConnectionDetector.h b/modules/sensors/dynamic_sensor/ConnectionDetector.h
index 0ee1df2..75fbb0b 100644
--- a/modules/sensors/dynamic_sensor/ConnectionDetector.h
+++ b/modules/sensors/dynamic_sensor/ConnectionDetector.h
@@ -34,6 +34,7 @@
 public:
     ConnectionDetector(BaseDynamicSensorDaemon *d) : mDaemon(d) { }
     virtual ~ConnectionDetector() = default;
+    virtual void Init() {}
 protected:
     BaseDynamicSensorDaemon* mDaemon;
 };
@@ -45,6 +46,7 @@
 public:
     SocketConnectionDetector(BaseDynamicSensorDaemon *d, int port);
     virtual ~SocketConnectionDetector();
+    void Init() override;
 private:
     // implement virtual of Thread
     virtual bool threadLoop();
@@ -62,6 +64,7 @@
     FileConnectionDetector(
             BaseDynamicSensorDaemon *d, const std::string &path, const std::string &regex);
     virtual ~FileConnectionDetector();
+    void Init() override;
 private:
     static constexpr int POLL_IDENT = 1;
     // implement virtual of Thread
diff --git a/modules/sensors/dynamic_sensor/DummyDynamicAccelDaemon.cpp b/modules/sensors/dynamic_sensor/DummyDynamicAccelDaemon.cpp
index a1a47e8..10771e3 100644
--- a/modules/sensors/dynamic_sensor/DummyDynamicAccelDaemon.cpp
+++ b/modules/sensors/dynamic_sensor/DummyDynamicAccelDaemon.cpp
@@ -28,7 +28,7 @@
 #include <netinet/in.h>
 #include <algorithm>            //std::max
 
-#define SYSPROP_PREFIX                  "dynamic_sensor.dummy"
+#define SYSPROP_PREFIX                  "vendor.dynamic_sensor.mock"
 #define FILE_NAME_BASE                  "dummy_accel_file"
 #define FILE_NAME_REGEX                 ("^" FILE_NAME_BASE "[0-9]$")
 
@@ -43,11 +43,13 @@
     if (strcmp(property, "") != 0) {
         mFileDetector = new FileConnectionDetector(
                 this, std::string(property), std::string(FILE_NAME_REGEX));
+        mFileDetector->Init();
     }
 
     property_get(SYSPROP_PREFIX ".socket", property, "");
     if (strcmp(property, "") != 0) {
         mSocketDetector = new SocketConnectionDetector(this, atoi(property));
+        mSocketDetector->Init();
     }
 }
 
diff --git a/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.cpp b/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.cpp
index df636a3..9f9a9fe 100644
--- a/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.cpp
+++ b/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.cpp
@@ -20,12 +20,22 @@
 #include <log/log.h>
 
 using ::android::hardware::sensors::V1_0::Result;
+using ::android::hardware::sensors::V2_1::SensorInfo;
+using ::android::hardware::sensors::V2_1::SensorType;
 template<class T> using Return = ::android::hardware::Return<T>;
 using ::android::hardware::Void;
 
 namespace android {
 namespace SensorHalExt {
 
+DynamicSensorsSubHal::DynamicSensorsSubHal() {
+    // initialize dynamic sensor manager
+    mDynamicSensorManager.reset(
+            DynamicSensorManager::createInstance(kDynamicHandleBase,
+                                                 kMaxDynamicHandleCount,
+                                                 nullptr /* callback */));
+}
+
 // ISensors.
 Return<Result> DynamicSensorsSubHal::setOperationMode(OperationMode mode) {
     return (mode == static_cast<OperationMode>(SENSOR_HAL_NORMAL_MODE) ?
@@ -77,9 +87,32 @@
 }
 
 Return<void> DynamicSensorsSubHal::getSensorsList_2_1(
-        getSensorsList_2_1_cb callback __unused) {
+        getSensorsList_2_1_cb callback) {
+    const sensor_t& sensor_info = mDynamicSensorManager->getDynamicMetaSensor();
+    std::vector<SensorInfo> sensors;
+
     ALOGD("DynamicSensorsSubHal::getSensorsList_2_1 invoked.");
 
+    // get the dynamic sensor info
+    sensors.resize(1);
+    sensors[0].sensorHandle = sensor_info.handle;
+    sensors[0].name = sensor_info.name;
+    sensors[0].vendor = sensor_info.vendor;
+    sensors[0].version = 1;
+    sensors[0].type = static_cast<SensorType>(sensor_info.type);
+    sensors[0].typeAsString = sensor_info.stringType;
+    sensors[0].maxRange = sensor_info.maxRange;
+    sensors[0].resolution = sensor_info.resolution;
+    sensors[0].power = sensor_info.power;
+    sensors[0].minDelay = sensor_info.minDelay;
+    sensors[0].fifoReservedEventCount = sensor_info.fifoReservedEventCount;
+    sensors[0].fifoMaxEventCount = sensor_info.fifoMaxEventCount;
+    sensors[0].requiredPermission = sensor_info.requiredPermission;
+    sensors[0].maxDelay = sensor_info.maxDelay;
+    sensors[0].flags = sensor_info.flags;
+
+    callback(sensors);
+
     return Void();
 }
 
diff --git a/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.h b/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.h
index 36ed9f5..ab5d299 100644
--- a/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.h
+++ b/modules/sensors/dynamic_sensor/DynamicSensorsSubHal.h
@@ -17,6 +17,8 @@
 #ifndef ANDROID_SENSORHAL_EXT_DYNAMIC_SENSORS_SUB_HAL_H
 #define ANDROID_SENSORHAL_EXT_DYNAMIC_SENSORS_SUB_HAL_H
 
+#include "DynamicSensorManager.h"
+
 #include <V2_1/SubHal.h>
 
 namespace android {
@@ -37,6 +39,8 @@
     using SharedMemInfo = ::android::hardware::sensors::V1_0::SharedMemInfo;
 
 public:
+    DynamicSensorsSubHal();
+
     // ISensors.
     Return<Result> setOperationMode(OperationMode mode) override;
     Return<Result> activate(int32_t sensor_handle, bool enabled) override;
@@ -60,6 +64,14 @@
     const std::string getName() override { return "Dynamic-SubHAL"; }
     Return<Result> initialize(
             const sp<IHalProxyCallback>& hal_proxy_callback) override;
+
+private:
+    static constexpr int32_t kDynamicHandleBase = 0;
+    static constexpr int32_t kDynamicHandleEnd = 0x1000000;
+    static constexpr int32_t kMaxDynamicHandleCount = kDynamicHandleEnd -
+                                                      kDynamicHandleBase;
+
+    std::unique_ptr<DynamicSensorManager> mDynamicSensorManager;
 };
 
 } // namespace SensorHalExt
diff --git a/modules/sensors/dynamic_sensor/HidRawSensorDaemon.cpp b/modules/sensors/dynamic_sensor/HidRawSensorDaemon.cpp
index 6bf34bc..4b447ac 100644
--- a/modules/sensors/dynamic_sensor/HidRawSensorDaemon.cpp
+++ b/modules/sensors/dynamic_sensor/HidRawSensorDaemon.cpp
@@ -39,6 +39,7 @@
         : BaseDynamicSensorDaemon(manager) {
     mDetector = new FileConnectionDetector(
             this, std::string(DEV_PATH), std::string(DEV_NAME_REGEX));
+    mDetector->Init();
 }
 
 BaseSensorVector HidRawSensorDaemon::createSensor(const std::string &deviceKey) {