diff --git a/sensors/Android.bp b/sensors/Android.bp index 1e8c400..f726453 100644 --- a/sensors/Android.bp +++ b/sensors/Android.bp @@ -20,6 +20,7 @@ cc_library_shared { ], header_libs: [ "android.hardware.sensors@2.X-multihal.header", + "libhardware_headers", ], cflags: [ "-DLOG_TAG=\"sensors.qsh_wrapper\"", diff --git a/sensors/SensorsSubHal.cpp b/sensors/SensorsSubHal.cpp index 932420c..ff749c3 100644 --- a/sensors/SensorsSubHal.cpp +++ b/sensors/SensorsSubHal.cpp @@ -7,6 +7,7 @@ #include #include +#include using ::android::hardware::sensors::V2_0::implementation::ScopedWakelock; using ::android::hardware::sensors::V2_1::implementation::ISensorsSubHal; @@ -21,6 +22,21 @@ namespace qsh_wrapper { namespace { constexpr auto kLibName = "sensors.qsh.so"; +constexpr auto kTypeUnderScreenRgbSensor = 33171070; + +// This is larger than any sensor handle returned by the HAL +constexpr auto kWrappedSensorHandleBase = 0x10000; +inline int32_t IsWrappedHandle(int32_t sensor_handle) { + return sensor_handle >= kWrappedSensorHandleBase; +} +inline int32_t FromWrappedHandle(int32_t sensor_handle) { + return IsWrappedHandle(sensor_handle) ? sensor_handle - kWrappedSensorHandleBase + : sensor_handle; +} +inline int32_t ToWrappedHandle(int32_t sensor_handle) { + return IsWrappedHandle(sensor_handle) ? sensor_handle + : sensor_handle + kWrappedSensorHandleBase; +} }; // anonymous namespace SensorsSubHal::SensorsSubHal() @@ -42,16 +58,17 @@ Return SensorsSubHal::setOperationMode(OperationMode mode) { } Return SensorsSubHal::activate(int32_t sensor_handle, bool enabled) { - return impl_->activate(sensor_handle, enabled); + return impl_->activate(FromWrappedHandle(sensor_handle), enabled); } Return SensorsSubHal::batch(int32_t sensor_handle, int64_t sampling_period_ns, int64_t max_report_latency_ns) { - return impl_->batch(sensor_handle, sampling_period_ns, max_report_latency_ns); + return impl_->batch(FromWrappedHandle(sensor_handle), sampling_period_ns, + max_report_latency_ns); } Return SensorsSubHal::flush(int32_t sensor_handle) { - return impl_->flush(sensor_handle); + return impl_->flush(FromWrappedHandle(sensor_handle)); } Return SensorsSubHal::registerDirectChannel(const SharedMemInfo& mem, @@ -66,14 +83,43 @@ Return SensorsSubHal::unregisterDirectChannel(int32_t channel_handle) { Return SensorsSubHal::configDirectReport(int32_t sensor_handle, int32_t channel_handle, RateLevel rate, ISensors::configDirectReport_cb _hidl_cb) { - return impl_->configDirectReport(sensor_handle, channel_handle, rate, _hidl_cb); + return impl_->configDirectReport(FromWrappedHandle(sensor_handle), channel_handle, rate, + _hidl_cb); } Return SensorsSubHal::getSensorsList_2_1(ISensors::getSensorsList_2_1_cb _hidl_cb) { - return impl_->getSensorsList_2_1(_hidl_cb); + return impl_->getSensorsList_2_1([&](const auto& _hidl_out_list) { + auto it = std::find_if(_hidl_out_list.begin(), _hidl_out_list.end(), [](auto&& v) { + return static_cast(v.type) == kTypeUnderScreenRgbSensor; + }); + if (it != _hidl_out_list.end()) { + auto last = _hidl_out_list.size(); + auto sensors = hidl_vec(last + 1); + std::copy(_hidl_out_list.begin(), _hidl_out_list.end(), sensors.begin()); + + handle_type_[it->sensorHandle] = it->type; + + sensors[last] = *it; + sensors[last].sensorHandle = ToWrappedHandle(sensors[last].sensorHandle); + sensors[last].name = "Aliased Light Sensor"; + sensors[last].type = SensorType::LIGHT; + sensors[last].typeAsString = ""; // Empty string is valid for known types + + LOG(INFO) << "High PWM Light sensor found, aliasing it to Light sensor"; + _hidl_cb(sensors); + } else { + _hidl_cb(_hidl_out_list); + } + }); } Return SensorsSubHal::injectSensorData_2_1(const Event& event) { + if (IsWrappedHandle(event.sensorHandle)) { + auto event_copy = event; + event_copy.sensorHandle = FromWrappedHandle(event.sensorHandle); + event_copy.sensorType = handle_type_[event.sensorHandle]; + return impl_->injectSensorData_2_1(event_copy); + } return impl_->injectSensorData_2_1(event); } @@ -105,7 +151,21 @@ Return SensorsSubHal::onDynamicSensorsConnected_2_1( } void SensorsSubHal::postEvents(const std::vector& events, ScopedWakelock wakelock) { - hal_proxy_callback_->postEvents(events, std::move(wakelock)); + std::vector wrapped_events; + for (auto&& e : events) { + if (static_cast(e.sensorType) == kTypeUnderScreenRgbSensor) { + auto event_copy = e; + event_copy.sensorHandle = ToWrappedHandle(e.sensorHandle); + event_copy.sensorType = SensorType::LIGHT; + wrapped_events.emplace_back(std::move(event_copy)); + } + } + if (wrapped_events.empty()) { + hal_proxy_callback_->postEvents(events, std::move(wakelock)); + } else { + wrapped_events.insert(wrapped_events.end(), events.begin(), events.end()); + hal_proxy_callback_->postEvents(wrapped_events, std::move(wakelock)); + } } ScopedWakelock SensorsSubHal::createScopedWakelock(bool lock) { diff --git a/sensors/SensorsSubHal.h b/sensors/SensorsSubHal.h index 46b145f..3cffd22 100644 --- a/sensors/SensorsSubHal.h +++ b/sensors/SensorsSubHal.h @@ -60,6 +60,8 @@ class SensorsSubHal : public ISensorsSubHal, public IHalProxyCallback { std::unique_ptr> lib_handle_; V2_1::implementation::ISensorsSubHal* impl_; sp hal_proxy_callback_; + + std::unordered_map handle_type_; }; } // namespace qsh_wrapper