InputMapper refactor: Configure empty InputDevice
Configure the Device prior to populating mappers for mappers to
receive correct property map
Test: atest inputflinger_tests
Bug: 256009910
Change-Id: I0a7d2bf4d64b3d120d9050e9154b3f3a0f54657a
diff --git a/services/inputflinger/reader/InputDevice.cpp b/services/inputflinger/reader/InputDevice.cpp
index 49998a0..586d44c 100644
--- a/services/inputflinger/reader/InputDevice.cpp
+++ b/services/inputflinger/reader/InputDevice.cpp
@@ -67,21 +67,26 @@
}
std::list<NotifyArgs> InputDevice::updateEnableState(nsecs_t when,
- const InputReaderConfiguration& readerConfig) {
- // If the device was explicitly disabled by the user, it would be present in the
- // "disabledDevices" list. This device should be disabled.
- bool enable = readerConfig.disabledDevices.find(mId) == readerConfig.disabledDevices.end();
+ const InputReaderConfiguration& readerConfig,
+ bool forceEnable) {
+ bool enable = forceEnable;
+ if (!forceEnable) {
+ // If the device was explicitly disabled by the user, it would be present in the
+ // "disabledDevices" list. This device should be disabled.
+ enable = readerConfig.disabledDevices.find(mId) == readerConfig.disabledDevices.end();
- // If a device is associated with a specific display but there is no
- // associated DisplayViewport, don't enable the device.
- if (enable && (mAssociatedDisplayPort || mAssociatedDisplayUniqueId) && !mAssociatedViewport) {
- const std::string desc = mAssociatedDisplayPort
- ? "port " + std::to_string(*mAssociatedDisplayPort)
- : "uniqueId " + *mAssociatedDisplayUniqueId;
- ALOGW("Cannot enable input device %s because it is associated "
- "with %s, but the corresponding viewport is not found",
- getName().c_str(), desc.c_str());
- enable = false;
+ // If a device is associated with a specific display but there is no
+ // associated DisplayViewport, don't enable the device.
+ if (enable && (mAssociatedDisplayPort || mAssociatedDisplayUniqueId) &&
+ !mAssociatedViewport) {
+ const std::string desc = mAssociatedDisplayPort
+ ? "port " + std::to_string(*mAssociatedDisplayPort)
+ : "uniqueId " + *mAssociatedDisplayUniqueId;
+ ALOGW("Cannot enable input device %s because it is associated "
+ "with %s, but the corresponding viewport is not found",
+ getName().c_str(), desc.c_str());
+ enable = false;
+ }
}
std::list<NotifyArgs> out;
@@ -168,18 +173,25 @@
mDevices.insert({eventHubId, std::make_pair(std::move(contextPtr), std::move(mappers))});
}
-void InputDevice::addEventHubDevice(int32_t eventHubId,
- const InputReaderConfiguration& readerConfig) {
+[[nodiscard]] std::list<NotifyArgs> InputDevice::addEventHubDevice(
+ nsecs_t when, int32_t eventHubId, const InputReaderConfiguration& readerConfig) {
if (mDevices.find(eventHubId) != mDevices.end()) {
- return;
+ return {};
}
- std::unique_ptr<InputDeviceContext> contextPtr(new InputDeviceContext(*this, eventHubId));
- std::vector<std::unique_ptr<InputMapper>> mappers = createMappers(*contextPtr, readerConfig);
- // insert the context into the devices set
- mDevices.insert({eventHubId, std::make_pair(std::move(contextPtr), std::move(mappers))});
+ // Add an empty device configure and keep it enabled to allow mapper population with correct
+ // configuration/context,
+ // Note: we need to ensure device is kept enabled till mappers are configured
+ // TODO: b/281852638 refactor tests to remove this flag and reliance on the empty device
+ addEmptyEventHubDevice(eventHubId);
+ std::list<NotifyArgs> out = configureInternal(when, readerConfig, {}, /*forceEnable=*/true);
+
+ DevicePair& devicePair = mDevices[eventHubId];
+ devicePair.second = createMappers(*devicePair.first, readerConfig);
+
// Must change generation to flag this device as changed
bumpGeneration();
+ return out;
}
void InputDevice::removeEventHubDevice(int32_t eventHubId) {
@@ -193,6 +205,12 @@
std::list<NotifyArgs> InputDevice::configure(nsecs_t when,
const InputReaderConfiguration& readerConfig,
ConfigurationChanges changes) {
+ return configureInternal(when, readerConfig, changes);
+}
+std::list<NotifyArgs> InputDevice::configureInternal(nsecs_t when,
+ const InputReaderConfiguration& readerConfig,
+ ConfigurationChanges changes,
+ bool forceEnable) {
std::list<NotifyArgs> out;
mSources = 0;
mClasses = ftl::Flags<InputDeviceClass>(0);
@@ -289,24 +307,16 @@
}
}
- if (changes.test(Change::ENABLED_STATE) || changes.test(Change::DISPLAY_INFO)) {
- // Whether a device is enabled can depend on the display association,
- // so update the enabled state when there is a change in display info.
- // NOTE: The first configuration of a mapper must happen with the device enabled.
- // Do not execute this code on the first configure to prevent mappers
- // from being configured with the device disabled.
- out += updateEnableState(when, readerConfig);
- }
-
for_each_mapper([this, when, &readerConfig, changes, &out](InputMapper& mapper) {
out += mapper.reconfigure(when, readerConfig, changes);
mSources |= mapper.getSources();
});
- // If a device is just plugged but it might be disabled, we need to update some info like
- // axis range of touch from each InputMapper first, then disable it.
- if (!changes.any()) {
- out += updateEnableState(when, readerConfig);
+ if (!changes.any() || changes.test(Change::ENABLED_STATE) ||
+ changes.test(Change::DISPLAY_INFO)) {
+ // Whether a device is enabled can depend on the display association,
+ // so update the enabled state when there is a change in display info.
+ out += updateEnableState(when, readerConfig, forceEnable);
}
}
return out;