Associate touch video devices with input devices
In earlier commits, we added touch video devices, but we did not add the
relationship between the input device and the video device. Add the
relationship here.
The matching between input devices and video devices is done by name
(for now). This was determined after reviewing the api for v4l2 devices,
which do not contain any obvious matching techniques, and do not have
.uniq values. This logic may be changed later.
The infrastructure being set up here, however, will remain as is.
Test: dumpsys input of a booted device, and interact with the device by
touch.
Bug: 62940136
Change-Id: I116e6ece8086359cd6546db7af6b2db707fca1e3
diff --git a/services/inputflinger/EventHub.cpp b/services/inputflinger/EventHub.cpp
index 904580f..b2d2f14 100644
--- a/services/inputflinger/EventHub.cpp
+++ b/services/inputflinger/EventHub.cpp
@@ -1344,6 +1344,17 @@
setLedForControllerLocked(device);
}
+ // Find a matching video device by comparing device names
+ for (std::unique_ptr<TouchVideoDevice>& videoDevice : mUnattachedVideoDevices) {
+ if (device->identifier.name == videoDevice->getName()) {
+ device->videoDevice = std::move(videoDevice);
+ break;
+ }
+ }
+ mUnattachedVideoDevices.erase(std::remove_if(mUnattachedVideoDevices.begin(),
+ mUnattachedVideoDevices.end(),
+ [](const std::unique_ptr<TouchVideoDevice>& videoDevice){
+ return videoDevice == nullptr; }), mUnattachedVideoDevices.end());
if (registerDeviceForEpollLocked(device) != OK) {
delete device;
@@ -1406,6 +1417,17 @@
ALOGE("Could not create touch video device for %s. Ignoring", devicePath.c_str());
return;
}
+ // Transfer ownership of this video device to a matching input device
+ for (size_t i = 0; i < mDevices.size(); i++) {
+ Device* device = mDevices.valueAt(i);
+ if (videoDevice->getName() == device->identifier.name) {
+ device->videoDevice = std::move(videoDevice);
+ return;
+ }
+ }
+
+ // Couldn't find a matching input device, so just add it to a temporary holding queue.
+ // A matching input device may appear later.
ALOGI("Adding video device %s to list of unattached video devices",
videoDevice->getName().c_str());
mUnattachedVideoDevices.push_back(std::move(videoDevice));
@@ -1599,7 +1621,21 @@
ALOGV("Remove device: %s not found, device may already have been removed.", devicePath);
}
+/**
+ * Find the video device by filename, and close it.
+ * The video device is closed by path during an inotify event, where we don't have the
+ * additional context about the video device fd, or the associated input device.
+ */
void EventHub::closeVideoDeviceByPathLocked(const std::string& devicePath) {
+ // A video device may be owned by an existing input device, or it may be stored in
+ // the mUnattachedVideoDevices queue. Check both locations.
+ for (size_t i = 0; i < mDevices.size(); i++) {
+ Device* device = mDevices.valueAt(i);
+ if (device->videoDevice && device->videoDevice->getPath() == devicePath) {
+ device->videoDevice = nullptr;
+ return;
+ }
+ }
mUnattachedVideoDevices.erase(std::remove_if(mUnattachedVideoDevices.begin(),
mUnattachedVideoDevices.end(), [&devicePath](
const std::unique_ptr<TouchVideoDevice>& videoDevice) {
@@ -1625,6 +1661,9 @@
}
unregisterDeviceFromEpollLocked(device);
+ if (device->videoDevice) {
+ mUnattachedVideoDevices.push_back(std::move(device->videoDevice));
+ }
releaseControllerNumberLocked(device);
@@ -1804,6 +1843,12 @@
device->configurationFile.c_str());
dump += StringPrintf(INDENT3 "HaveKeyboardLayoutOverlay: %s\n",
toString(device->overlayKeyMap != nullptr));
+ dump += INDENT3 "VideoDevice: ";
+ if (device->videoDevice) {
+ dump += device->videoDevice->dump() + "\n";
+ } else {
+ dump += "<none>\n";
+ }
}
dump += INDENT "Unattached video devices:\n";