diff options
-rw-r--r-- | services/inputflinger/reader/EventHub.cpp | 63 | ||||
-rw-r--r-- | services/inputflinger/reader/include/EventHub.h | 1 |
2 files changed, 33 insertions, 31 deletions
diff --git a/services/inputflinger/reader/EventHub.cpp b/services/inputflinger/reader/EventHub.cpp index 013ef862ad..cc105bdf24 100644 --- a/services/inputflinger/reader/EventHub.cpp +++ b/services/inputflinger/reader/EventHub.cpp @@ -1620,41 +1620,47 @@ std::shared_ptr<const EventHub::AssociatedDevice> EventHub::obtainAssociatedDevi const auto& path = *sysfsRootPathOpt; - std::shared_ptr<const AssociatedDevice> associatedDevice = std::make_shared<AssociatedDevice>( - AssociatedDevice{.sysfsRootPath = path, - .batteryInfos = readBatteryConfiguration(path), - .lightInfos = readLightsConfiguration(path), - .layoutInfo = readLayoutConfiguration(path)}); - - bool associatedDeviceChanged = false; + std::shared_ptr<const AssociatedDevice> associatedDevice; for (const auto& [id, dev] : mDevices) { - if (dev->associatedDevice && dev->associatedDevice->sysfsRootPath == path) { - if (*associatedDevice != *dev->associatedDevice) { - associatedDeviceChanged = true; - dev->associatedDevice = associatedDevice; - } + if (!dev->associatedDevice || dev->associatedDevice->sysfsRootPath != path) { + continue; + } + if (!associatedDevice) { + // Found matching associated device for the first time. associatedDevice = dev->associatedDevice; + // Reload this associated device if needed. + const auto reloadedDevice = AssociatedDevice(path); + if (reloadedDevice != *dev->associatedDevice) { + ALOGI("The AssociatedDevice changed for path '%s'. Using new AssociatedDevice: %s", + path.c_str(), associatedDevice->dump().c_str()); + associatedDevice = std::make_shared<AssociatedDevice>(std::move(reloadedDevice)); + } } + // Update the associatedDevice. + dev->associatedDevice = associatedDevice; + } + + if (!associatedDevice) { + // No existing associated device found for this path, so create a new one. + associatedDevice = std::make_shared<AssociatedDevice>(path); } - ALOGI_IF(associatedDeviceChanged, - "The AssociatedDevice changed for path '%s'. Using new AssociatedDevice: %s", - path.c_str(), associatedDevice->dump().c_str()); return associatedDevice; } +EventHub::AssociatedDevice::AssociatedDevice(const std::filesystem::path& sysfsRootPath) + : sysfsRootPath(sysfsRootPath), + batteryInfos(readBatteryConfiguration(sysfsRootPath)), + lightInfos(readLightsConfiguration(sysfsRootPath)), + layoutInfo(readLayoutConfiguration(sysfsRootPath)) {} + bool EventHub::AssociatedDevice::isChanged() const { - std::unordered_map<int32_t, RawBatteryInfo> newBatteryInfos = - readBatteryConfiguration(sysfsRootPath); - std::unordered_map<int32_t, RawLightInfo> newLightInfos = - readLightsConfiguration(sysfsRootPath); - std::optional<RawLayoutInfo> newLayoutInfo = readLayoutConfiguration(sysfsRootPath); - - if (newBatteryInfos == batteryInfos && newLightInfos == lightInfos && - newLayoutInfo == layoutInfo) { - return false; - } - return true; + return AssociatedDevice(sysfsRootPath) != *this; +} + +std::string EventHub::AssociatedDevice::dump() const { + return StringPrintf("path=%s, numBatteries=%zu, numLight=%zu", sysfsRootPath.c_str(), + batteryInfos.size(), lightInfos.size()); } void EventHub::vibrate(int32_t deviceId, const VibrationElement& element) { @@ -2972,9 +2978,4 @@ void EventHub::monitor() const { std::unique_lock<std::mutex> lock(mLock); } -std::string EventHub::AssociatedDevice::dump() const { - return StringPrintf("path=%s, numBatteries=%zu, numLight=%zu", sysfsRootPath.c_str(), - batteryInfos.size(), lightInfos.size()); -} - } // namespace android diff --git a/services/inputflinger/reader/include/EventHub.h b/services/inputflinger/reader/include/EventHub.h index 5839b4c41c..8109dae715 100644 --- a/services/inputflinger/reader/include/EventHub.h +++ b/services/inputflinger/reader/include/EventHub.h @@ -619,6 +619,7 @@ public: private: // Holds information about the sysfs device associated with the Device. struct AssociatedDevice { + AssociatedDevice(const std::filesystem::path& sysfsRootPath); // The sysfs root path of the misc device. std::filesystem::path sysfsRootPath; std::unordered_map<int32_t /*batteryId*/, RawBatteryInfo> batteryInfos; |