diff options
7 files changed, 29 insertions, 29 deletions
diff --git a/services/inputflinger/reader/InputDevice.cpp b/services/inputflinger/reader/InputDevice.cpp index 2bf634282e..aee14151cc 100644 --- a/services/inputflinger/reader/InputDevice.cpp +++ b/services/inputflinger/reader/InputDevice.cpp @@ -171,18 +171,23 @@ void InputDevice::addEmptyEventHubDevice(int32_t eventHubId) { 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 + addEmptyEventHubDevice(eventHubId); + std::list<NotifyArgs> out = configure(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) { @@ -195,7 +200,7 @@ void InputDevice::removeEventHubDevice(int32_t eventHubId) { std::list<NotifyArgs> InputDevice::configure(nsecs_t when, const InputReaderConfiguration& readerConfig, - ConfigurationChanges changes) { + ConfigurationChanges changes, bool forceEnable) { std::list<NotifyArgs> out; mSources = 0; mClasses = ftl::Flags<InputDeviceClass>(0); @@ -308,25 +313,17 @@ std::list<NotifyArgs> InputDevice::configure(nsecs_t when, } } - if (changes.test(Change::ENABLED_STATE) || changes.test(Change::DISPLAY_INFO)) { + 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. - // 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, false); + out += updateEnableState(when, readerConfig, forceEnable); } 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); - } } return out; } diff --git a/services/inputflinger/reader/InputReader.cpp b/services/inputflinger/reader/InputReader.cpp index ea95f7857a..7d0f28b508 100644 --- a/services/inputflinger/reader/InputReader.cpp +++ b/services/inputflinger/reader/InputReader.cpp @@ -234,7 +234,7 @@ void InputReader::addDeviceLocked(nsecs_t when, int32_t eventHubId) { } InputDeviceIdentifier identifier = mEventHub->getDeviceIdentifier(eventHubId); - std::shared_ptr<InputDevice> device = createDeviceLocked(eventHubId, identifier); + std::shared_ptr<InputDevice> device = createDeviceLocked(when, eventHubId, identifier); notifyAll(device->configure(when, mConfig, /*changes=*/{})); notifyAll(device->reset(when)); @@ -319,7 +319,7 @@ void InputReader::removeDeviceLocked(nsecs_t when, int32_t eventHubId) { } std::shared_ptr<InputDevice> InputReader::createDeviceLocked( - int32_t eventHubId, const InputDeviceIdentifier& identifier) { + nsecs_t when, int32_t eventHubId, const InputDeviceIdentifier& identifier) { auto deviceIt = std::find_if(mDevices.begin(), mDevices.end(), [identifier](auto& devicePair) { const InputDeviceIdentifier identifier2 = devicePair.second->getDeviceInfo().getIdentifier(); @@ -334,7 +334,7 @@ std::shared_ptr<InputDevice> InputReader::createDeviceLocked( device = std::make_shared<InputDevice>(&mContext, deviceId, bumpGenerationLocked(), identifier); } - device->addEventHubDevice(eventHubId, mConfig); + notifyAll(device->addEventHubDevice(when, eventHubId, mConfig)); return device; } diff --git a/services/inputflinger/reader/include/InputDevice.h b/services/inputflinger/reader/include/InputDevice.h index 837c3c4902..7213ec2d0a 100644 --- a/services/inputflinger/reader/include/InputDevice.h +++ b/services/inputflinger/reader/include/InputDevice.h @@ -80,11 +80,13 @@ public: void dump(std::string& dump, const std::string& eventHubDevStr); void addEmptyEventHubDevice(int32_t eventHubId); - void addEventHubDevice(int32_t eventHubId, const InputReaderConfiguration& readerConfig); + [[nodiscard]] std::list<NotifyArgs> addEventHubDevice( + nsecs_t when, int32_t eventHubId, const InputReaderConfiguration& readerConfig); void removeEventHubDevice(int32_t eventHubId); [[nodiscard]] std::list<NotifyArgs> configure(nsecs_t when, const InputReaderConfiguration& readerConfig, - ConfigurationChanges changes); + ConfigurationChanges changes, + bool forceEnable = false); [[nodiscard]] std::list<NotifyArgs> reset(nsecs_t when); [[nodiscard]] std::list<NotifyArgs> process(const RawEvent* rawEvents, size_t count); [[nodiscard]] std::list<NotifyArgs> timeoutExpired(nsecs_t when); diff --git a/services/inputflinger/reader/include/InputReader.h b/services/inputflinger/reader/include/InputReader.h index 9112913565..391a8895dd 100644 --- a/services/inputflinger/reader/include/InputReader.h +++ b/services/inputflinger/reader/include/InputReader.h @@ -121,7 +121,7 @@ public: protected: // These members are protected so they can be instrumented by test cases. - virtual std::shared_ptr<InputDevice> createDeviceLocked(int32_t deviceId, + virtual std::shared_ptr<InputDevice> createDeviceLocked(nsecs_t when, int32_t deviceId, const InputDeviceIdentifier& identifier) REQUIRES(mLock); diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index aab8a4715d..7d157f61a1 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -2584,7 +2584,8 @@ TEST_F(InputDeviceTest, DumpDoesNotCrash) { mFakeEventHub->addDevice(TEST_EVENTHUB_ID, "Test EventHub device", InputDeviceClass::BATTERY); InputDevice device(mReader->getContext(), /*id=*/1, /*generation=*/2, /*identifier=*/{}); - device.addEventHubDevice(TEST_EVENTHUB_ID, mFakePolicy->getReaderConfiguration()); + auto _ = device.addEventHubDevice(ARBITRARY_TIME, TEST_EVENTHUB_ID, + mFakePolicy->getReaderConfiguration()); device.removeEventHubDevice(TEST_EVENTHUB_ID); std::string dumpStr, eventHubDevStr; device.dump(dumpStr, eventHubDevStr); diff --git a/services/inputflinger/tests/InstrumentedInputReader.cpp b/services/inputflinger/tests/InstrumentedInputReader.cpp index 1f8cd12b75..110ca5fab0 100644 --- a/services/inputflinger/tests/InstrumentedInputReader.cpp +++ b/services/inputflinger/tests/InstrumentedInputReader.cpp @@ -38,13 +38,13 @@ std::shared_ptr<InputDevice> InstrumentedInputReader::newDevice(int32_t deviceId } std::shared_ptr<InputDevice> InstrumentedInputReader::createDeviceLocked( - int32_t eventHubId, const InputDeviceIdentifier& identifier) REQUIRES(mLock) { + nsecs_t when, int32_t eventHubId, const InputDeviceIdentifier& identifier) REQUIRES(mLock) { if (!mNextDevices.empty()) { std::shared_ptr<InputDevice> device(std::move(mNextDevices.front())); mNextDevices.pop(); return device; } - return InputReader::createDeviceLocked(eventHubId, identifier); + return InputReader::createDeviceLocked(when, eventHubId, identifier); } } // namespace android diff --git a/services/inputflinger/tests/InstrumentedInputReader.h b/services/inputflinger/tests/InstrumentedInputReader.h index 7f8d5562ef..e6bf3f98b5 100644 --- a/services/inputflinger/tests/InstrumentedInputReader.h +++ b/services/inputflinger/tests/InstrumentedInputReader.h @@ -44,7 +44,7 @@ public: protected: virtual std::shared_ptr<InputDevice> createDeviceLocked( - int32_t eventHubId, const InputDeviceIdentifier& identifier); + nsecs_t when, int32_t eventHubId, const InputDeviceIdentifier& identifier); class FakeInputReaderContext : public ContextImpl { public: |